<!DOCTYPE HTML>
<html>
<head>
<title>HDF5 File Format Specification Version 2.0</title>

<style type="text/css">
h1 {
    display: block;
    margin-top: 24px;
    margin-bottom: 24px;
    margin-left: 0px;
    margin-right: 0px;
    text-indent: 0px;
}

h2 {
    display: block;
    margin-top: 8x;
    margin-bottom: 8px;
    margin-left: 0px;
    margin-right: 0px;
    text-indent: 0px;
}

/*
A horizontal rule ( <hr />) should be placed on the line above
each h2 tag. The h2 tags are used on the main sections along with
the hr tags. */
h3 {
    display: block;
    margin-top: 8px;
    margin-bottom: 8px;
    margin-left: 0px;
    margin-right: 0px;
    text-indent: 0px;
}

h4 {
    display: block;
    margin-top: 8px;
    margin-bottom: 8px;
    margin-left: 0px;
    margin-right: 0px;
    text-indent: 0px;
}

p {
    display: block;
    margin-top: 8px;
    margin-bottom: 8px;
    margin-left: 0px;
    margin-right: 0px;
    text-indent: 0px;
}

/*
p.item {
    margin-left: 2em;
    text-indent: -2em
}

*/
/*
p.item2 {
    margin-left: 2em;
    text-indent: 2em
}

*/
table.format {
    border: solid;
    border-collapse: collapse;
    caption-side: top;
    text-align: center;
    width: 80%;
}

table.format th {
    border: ridge;
    padding: 4px;
    width: 25%;
}

table.format td {
    border: ridge;
    padding: 4px;
}

table.format caption {
    font-weight: bold;
    font-size: larger;
    width: 800px;
}

table.note {
    border: none;
    text-align: right;
    width: 80%;
}

table.desc {
    border: solid;
    border-collapse: collapse;
    caption-side: top;
    text-align: left;
    width: 80%;
}

table.desc tr {
    vertical-align: top;
}

table.desc th {
    border-style: ridge;
    font-size: larger;
    padding: 4px; /*
    text-decoration: underline;
    */
}

table.desc td {
    border-style: ridge; /*
    padding: 4px; */
    vertical-align: text-top;
}

table.desc caption {
    font-weight: bold;
    font-size: larger;
    width: 800px;
}

table.list {
    border: none;
    width: 100%
}

table.list tr {
    vertical-align: text-top;
}

table.list th {
    border: none;
    text-decoration: underline;
    vertical-align: text-top;
}

table.list td {
    border: none;
    vertical-align: text-top;
}

table.msgdesc {
    border: none;
    text-align: left;
    width: 80%
}

table.msgdesc tr {
    vertical-align: text-top;
    border-spacing: 0;
    padding: 0;
}

table.msgdesc th {
    border: none;
    text-decoration: underline;
    vertical-align: text-top;
}

table.msgdesc td {
    border: none;
    vertical-align: text-top;
}

table.list80 {
    border: none;
    width: 80%
}

table.list80 tr {
    vertical-align: text-top;
}

table.list80 th {
    border: none;
    text-decoration: underline;
    vertical-align: text-top;
}

table.list80 td {
    border: none;
    vertical-align: text-top;
}

table.glossary {
    border: none;
    text-align: left;
    width: 80%
}

table.glossary tr {
    vertical-align: text-top;
    border-spacing: 0;
    padding: 0;
}

table.glossary th {
    border: none;
    text-align: left;
    text-decoration: underline;
    vertical-align: text-top;
}

table.glossary td {
    border: none;
    text-align: left;
    vertical-align: text-top;
}

div {
    page-break-inside: avoid;
    page-break-after: auto
}
</style>
</head>
<body>
<div class="full_width_table">
<center>
    <table border="0" width="90%">
        <tr>
            <td valign="top">
                <ol type="I">
                    <li><a href="#Intro">Introduction</a></li>
                    <font size="-1">
                        <ol type="A">
                            <li><a href="#ThisDocument">This Document</a></li>
                            <li><a href="#ChangesForHdf5_1_10">Changes for HDF5 1.10</a></li>
                        </ol>
                    </font>

                    <li><a href="#FileMetaData">Disk Format: Level 0 - File
                            Metadata</a></li>
                    <font size="-1">
                        <ol type="A">
                            <li><a href="#Superblock">Disk Format: Level 0A - Format
                                    Signature and Superblock</a></li>
                            <li><a href="#DriverInfo">Disk Format: Level 0B - File
                                    Driver Info</a></li>
                            <li><a href="#SuperblockExt">Disk Format: Level 0C -
                                    Superblock Extension</a></li>
                        </ol>
                    </font>
                    <li><a href="#FileInfra">Disk Format: Level 1 - File
                            Infrastructure</a></li>
                    <font size="-1">
                        <ol type="A">
                            <li><a href="#Btrees">Disk Format: Level 1A - B-trees
                                    and B-tree Nodes</a></li>
                            <ol type="1">
                                <li><a href="#V1Btrees">Disk Format: Level 1A1 -
                                        Version 1 B-trees (B-link Trees)</a></li>
                                <li><a href="#V2Btrees">Disk Format: Level 1A2 -
                                        Version 2 B-trees</a></li>
                            </ol>
                            <li><a href="#SymbolTable">Disk Format: Level 1B - Group
                                    Symbol Table Nodes</a></li>
                            <li><a href="#SymbolTableEntry">Disk Format: Level 1C -
                                    Symbol Table Entry</a></li>
                            <li><a href="#LocalHeap">Disk Format: Level 1D - Local
                                    Heaps</a></li>
                            <li><a href="#GlobalHeap">Disk Format: Level 1E - Global
                                    Heap</a></li>
                            <li><a href="#FractalHeap">Disk Format: Level 1F -
                                    Fractal Heap</a></li>
                            <li><a href="#FreeSpaceManager">Disk Format: Level 1G -
                                    Free-space Manager</a></li>
                            <li><a href="#SOHMTable">Disk Format: Level 1H - Shared
                                    Object Header Message Table</a></li>
                        </ol>
                    </font>
                    <li><a href="#DataObject">Disk Format: Level 2 - Data
                            Objects</a></li>
                    <font size="-1">
                        <ol type="A">
                            <li><a href="#ObjectHeader">Disk Format: Level 2A - Data
                                    Object Headers</a></li>
                            <ol type="1">
                                <li><a href="#ObjectHeaderPrefix">Disk Format: Level
                                        2A1 - Data Object Header Prefix</a></li>
                                <ol type="a">
                                    <li><a href="#V1ObjectHeaderPrefix">Version 1 Data
                                            Object Header Prefix</a></li>
                                    <li><a href="#V2ObjectHeaderPrefix">Version 2 Data
                                            Object Header Prefix</a></li>
                                </ol>
                                <li><a href="#ObjectHeaderMessages">Disk Format: Level
                                        2A2 - Data Object Header Messages</a></li>
                                <ol type="a">
                                    <li><a href="#NILMessage">The NIL Message</a></li>
                                    <!-- 0x0000 -->
                                    <li><a href="#DataspaceMessage">The Dataspace Message</a></li>
                                    <!-- 0x0001 -->
                                    <li><a href="#LinkInfoMessage">The Link Info Message</a></li>
                                    <!-- 0x0002 -->
                                </ol>
                            </ol>
                        </ol>
                    </font>
                </ol>
            </td>

            <td>&nbsp;</td>

            <td valign="top">
                <ol type="I" start="4">
                    <li><a href="#DataObject">Disk Format: Level 2 - Data
                            Objects</a><font size="-1"><i> (Continued)</i></font></li>
                    <ol type="A">
                        <li><a href="#ObjectHeader">Disk Format: Level 2A - Data
                                Object Headers</a><i> (Continued)</i></li>
                        <ol type="1" start="2">
                            <li><a href="#ObjectHeaderMessages">Disk Format: Level
                                    2A2 - Data Object Header Messages</a><i> (Continued)</i></li>
                            <ol type="a" start="4">
                                <li><a href="#DatatypeMessage">The Datatype Message</a></li>
                                <!-- 0x0003 -->
                                <li><a href="#OldFillValueMessage">The Data Storage -
                                        Fill Value (Old) Message</a></li>
                                <!-- 0x0004 -->
                                <li><a href="#FillValueMessage">The Data Storage - Fill
                                        Value Message</a></li>
                                <!-- 0x0005 -->
                                <li><a href="#LinkMessage">The Link Message</a></li>
                                <!-- 0x0006 -->
                                <li><a href="#ExternalFileListMessage">The Data Storage
                                        - External Data Files Message</a></li>
                                <!-- 0x0007 -->
                                <li><a href="#LayoutMessage">The Data Storage - Layout
                                        Message</a></li>
                                <!-- 0x0008 -->
                                <li><a href="#BogusMessage">The Bogus Message</a></li>
                                <!-- 0x0009 -->
                                <li><a href="#GroupInfoMessage">The Group Info Message</a></li>
                                <!-- 0x000a -->
                                <li><a href="#FilterMessage">The Data Storage - Filter
                                        Pipeline Message</a></li>
                                <!-- 0x000b -->
                                <li><a href="#AttributeMessage">The Attribute Message</a></li>
                                <!-- 0x000c -->
                                <li><a href="#CommentMessage">The Object Comment
                                        Message</a></li>
                                <!-- 0x000d -->
                                <li><a href="#OldModificationTimeMessage">The Object
                                        Modification Time (Old) Message</a></li>
                                <!-- 0x000e -->
                                <li><a href="#SOHMTableMessage">The Shared Message
                                        Table Message</a></li>
                                <!-- 0x000f -->
                                <li><a href="#ContinuationMessage">The Object Header
                                        Continuation Message</a></li>
                                <!-- 0x0010 -->
                                <li><a href="#SymbolTableMessage">The Symbol Table
                                        Message</a></li>
                                <!-- 0x0011 -->
                                <li><a href="#ModificationTimeMessage">The Object
                                        Modification Time Message</a></li>
                                <!-- 0x0012 -->
                                <li><a href="#BtreeKValuesMessage">The B-tree
                                        &lsquo;K&rsquo; Values Message</a></li>
                                <!-- 0x0013 -->
                                <li><a href="#DrvInfoMessage">The Driver Info Message</a></li>
                                <!-- 0x0014 -->
                                <li><a href="#AinfoMessage">The Attribute Info Message</a></li>
                                <!-- 0x0015 -->
                                <li><a href="#RefCountMessage">The Object Reference
                                        Count Message</a></li>
                                <!-- 0x0016 -->
                                <li><a href="#FsinfoMessage">The File Space Info
                                        Message</a></li>
                                <!-- 0x0018 -->
                            </ol>
                        </ol>
                        <li><a href="#DataStorage">Disk Format: Level 2B - Data
                                Object Data Storage</a></li>
                    </ol>
                    <font></font>
                    <li><a href="#AppendixA">Appendix A: Definitions</a></li>
                    <li><a href="#AppendixB">Appendix B: File Memory
                            Allocation Types</a></li>
                </ol>
            </td>
        </tr>
    </table>
</center>



<br />
<br />
<hr />
<a name="Intro"><h2>I. Introduction</h2></a>

<table align="right" width="100">
    <tr>
        <td>&nbsp;</td>
        <td align="center">
            <hr /> <img src="FF-IH_FileGroup.gif" alt="HDF5 Groups" hspace="15"
            vspace="15">
        </td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td align="center"><strong>Figure 1:</strong> Relationships among
            the HDF5 root group, other groups, and objects
            <hr /></td>
        <td>&nbsp;</td>
    </tr>

    <tr>
        <td>&nbsp;</td>
        <td align="center"><img src="FF-IH_FileObject.gif"
            alt="HDF5 Objects" hspace="15" vspace="15"></td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td align="center"><strong>Figure 2:</strong> HDF5 objects --
            datasets, datatypes, or dataspaces
            <hr /></td>
        <td>&nbsp;</td>
    </tr>
</table>


<p>The format of an HDF5 file on disk encompasses several key ideas
    of the HDF4 and AIO file formats as well as addressing some
    shortcomings therein. The new format is more self-describing than the
    HDF4 format and is more uniformly applied to data objects in the file.</p>

<p>An HDF5 file appears to the user as a directed graph. The nodes
    of this graph are the higher-level HDF5 objects that are exposed by the
    HDF5 APIs:</p>

<ul>
    <li>Groups</li>
    <li>Datasets</li>
    <li>Committed (formerly Named) datatypes</li>
</ul>

<p>At the lowest level, as information is actually written to the
    disk, an HDF5 file is made up of the following objects:</p>
<ul>
    <li>A superblock</li>
    <li>B-tree nodes</li>
    <li>Heap blocks</li>
    <li>Object headers</li>
    <li>Object data</li>
    <li>Free space</li>
</ul>

<p>The HDF5 Library uses these low-level objects to represent the
    higher-level objects that are then presented to the user or to
    applications through the APIs. For instance, a group is an object
    header that contains a message that points to a local heap (for storing
    the links to objects in the group) and to a B-tree (which indexes the
    links). A dataset is an object header that contains messages that
    describe datatype, dataspace, layout, filters, external files, fill
    value, and other elements with the layout message pointing to either a
    raw data chunk or to a B-tree that points to raw data chunks.</p>


<br />
<a name="ThisDocument"><h3>I.A. This Document</h3></a>

<p>
    This document describes the lower-level data objects; the higher-level
    objects and their properties are described in the <a
        href="UG/HDF5_User_Guide-Responsive HTML5/index.html"><cite>HDF5
            User Guide</cite></a>.
</p>

<p>
    Three levels of information comprise the file format. Level 0 contains
    basic information for identifying and defining information about the
    file. Level 1 information contains the information about the pieces of
    a file shared by many objects in the file (such as a B-trees and
    heaps). Level 2 is the rest of the file and contains all of the data
    objects, with each object partitioned into header information, also
    known as <em>metadata</em>, and data.
</p>

<p>
    The sizes of various fields in the following layout tables are
    determined by looking at the number of columns the field spans in the
    table. There are three exceptions: (1) The size may be overridden by
    specifying a size in parentheses, (2) the size of addresses is
    determined by the <em>Size of Offsets</em> field in the superblock and
    is indicated in this document with a superscripted &lsquo;O&rsquo;, and
    (3) the size of length fields is determined by the <em>Size of
        Lengths</em> field in the superblock and is indicated in this document with
    a superscripted &lsquo;L&rsquo;.
</p>

<p>Values for all fields in this document should be treated as
    unsigned integers, unless otherwise noted in the description of a
    field. Additionally, all metadata fields are stored in little-endian
    byte order.</p>

<p>
    All checksums used in the format are computed with the <a
        href="http://www.burtleburtle.net/bob/hash/doobs.html">Jenkins&rsquo;
        lookup3</a> algorithm.
</p>

<p>Whenever a bit flag or field is mentioned for an entry, bits are
    numbered from the lowest bit position in the entry.</p>

<p>Various tables in this document aligned with &ldquo;This space
    inserted only to align table nicely&rdquo;. These entries in the table
    are just to make the table presentation nicer and do not represent any
    values or padding in the file.</p>


<br />
<a name="ChangesForHdf5_1_10"><h3>I.B. Changes for HDF5 1.10</h3></a>

<p>As of October 2015, changes in the file format for HDF5 1.10 have
    not yet been finalized.</p>



<br />
<br />
<hr />
<h2>
    <a name="FileMetaData"> II. Disk Format: Level 0 - File Metadata</a>
</h2>

<br />
<h3>
    <a name="Superblock"> II.A. Disk Format: Level 0A - Format
        Signature and Superblock</a>
</h3>

<p>The superblock may begin at certain predefined offsets within the
    HDF5 file, allowing a block of unspecified content for users to place
    additional information at the beginning (and end) of the HDF5 file
    without limiting the HDF5 Library&rsquo;s ability to manage the objects
    within the file itself. This feature was designed to accommodate
    wrapping an HDF5 file in another file format or adding descriptive
    information to an HDF5 file without requiring the modification of the
    actual file&rsquo;s information. The superblock is located by searching
    for the HDF5 format signature at byte offset 0, byte offset 512, and at
    successive locations in the file, each a multiple of two of the
    previous location; in other words, at these byte offsets: 0, 512, 1024,
    2048, and so on.</p>

<p>The superblock is composed of the format signature, followed by a
    superblock version number and information that is specific to each
    version of the superblock. Currently, there are three versions of the
    superblock format. Version 0 is the default format, while version 1 is
    basically the same as version 0 with additional information when a
    non-default B-tree &lsquo;K&rsquo; value is stored. Version 2 is the
    latest format, with some fields eliminated or compressed and with
    superblock extension and checksum support.</p>

<p>Version 0 and 1 of the superblock are described below:</p>


<div align="center">
    <table class="format">
        <caption>Superblock (Versions 0 and 1)</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Format Signature (8 bytes)<br />
            <br /></td>
        </tr>

        <tr>
            <td>Version # of Superblock</td>
            <td>Version # of File&rsquo;s Free Space Storage</td>
            <td>Version # of Root Group Symbol Table Entry</td>
            <td>Reserved (zero)</td>
        </tr>

        <tr>
            <td>Version # of Shared Header Message Format</td>
            <td>Size of Offsets</td>
            <td>Size of Lengths</td>
            <td>Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="2">Group Leaf Node K</td>
            <td colspan="2">Group Internal Node K</td>
        </tr>

        <tr>
            <td colspan="4">File Consistency Flags</td>
        </tr>

        <tr>
            <td colspan="2" style="border: dotted;">Indexed Storage Internal
                Node K<sup>1</sup>
            </td>
            <td colspan="2" style="border: dotted;">Reserved (zero)<sup>1</sup></td>
        </tr>

        <tr>
            <td colspan="4"><br />Base Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of File Free space Info<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />End of File Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Driver Information Block Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Root Group Symbol Table Entry</td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets.&rdquo;)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with a &lsquo;1&rsquo; in the above table are
                new in version 1 of the superblock)</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Format Signature</p></td>
            <td><p>This field contains a constant value and can be used
                    to quickly identify a file as being an HDF5 file. The constant
                    value is designed to allow easy identification of an HDF5 file and
                    to allow certain types of data corruption to be detected. The file
                    signature of an HDF5 file always contains the following values:</p>
                <center>
                    <table border align="center" cellpadding="4">
                        <tr align="center">
                            <td align="right">Decimal:</td>
                            <td width="8%">137</td>
                            <td width="8%">72</td>
                            <td width="8%">68</td>
                            <td width="8%">70</td>
                            <td width="8%">13</td>
                            <td width="8%">10</td>
                            <td width="8%">26</td>
                            <td width="8%">10</td>
                        </tr>

                        <tr align="center">
                            <td align="right">Hexadecimal:</td>
                            <td>89</td>
                            <td>48</td>
                            <td>44</td>
                            <td>46</td>
                            <td>0d</td>
                            <td>0a</td>
                            <td>1a</td>
                            <td>0a</td>
                        </tr>

                        <tr align="center">
                            <td align="right">ASCII C Notation:</td>
                            <td>\211</td>
                            <td>H</td>
                            <td>D</td>
                            <td>F</td>
                            <td>\r</td>
                            <td>\n</td>
                            <td>\032</td>
                            <td>\n</td>
                        </tr>
                    </table>
                </center>
                <p>
                    This signature both identifies the file as an HDF5 file and
                    provides for immediate detection of common file-transfer problems.
                    The first two bytes distinguish HDF5 files on systems that expect
                    the first two bytes to identify the file type uniquely. The first
                    byte is chosen as a non-ASCII value to reduce the probability that
                    a text file may be misrecognized as an HDF5 file; also, it catches
                    bad file transfers that clear bit 7. Bytes two through four name
                    the format. The CR-LF sequence catches bad file transfers that
                    alter newline sequences. The control-Z character stops file display
                    under MS-DOS. The final line feed checks for the inverse of the
                    CR-LF translation problem. (This is a direct descendent of the <a
                        href="http://www.libpng.org/pub/png/spec/iso/index-object.html#5PNG-file-signature">PNG</a>
                    file signature.)
                </p>
                <p>
                    <em>This field is present in version 0+ of the superblock.</em>
                </p></td>
        </tr>

        <tr>
            <td><p>Version Number of the Superblock</p></td>
            <td><p>This value is used to determine the format of the
                    information in the superblock. When the format of the information
                    in the superblock is changed, the version number is incremented to
                    the next integer and can be used to determine how the information
                    in the superblock is formatted.</p>

                <p>Values of 0, 1 and 2 are defined for this field. (The format
                    of version 2 is described below, not here)</p>

                <p>
                    <em>This field is present in version 0+ of the superblock.</em>
                </p></td>
        </tr>

        <tr>
            <td><p>Version Number of the File&rsquo;s Free Space
                    Information</p></td>
            <td>
                <p>This value is used to determine the format of the
                    file&rsquo;s free space information.</p>
                <p>
                    The only value currently valid in this field is &lsquo;0&rsquo;,
                    which indicates that the file&rsquo;s free space is as described <a
                        href="#FreeSpaceManager">below</a>.
                </p>

                <p>
                    <em>This field is present in version 0 and 1 of the
                        superblock.</em>
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version Number of the Root Group Symbol Table Entry</p></td>
            <td><p>This value is used to determine the format of the
                    information in the Root Group Symbol Table Entry. When the format
                    of the information in that field is changed, the version number is
                    incremented to the next integer and can be used to determine how
                    the information in the field is formatted.</p>
                <p>
                    The only value currently valid in this field is &lsquo;0&rsquo;,
                    which indicates that the root group symbol table entry is formatted
                    as described <a href="#SymbolTableEntry">below</a>.
                </p>
                <p>
                    <em>This field is present in version 0 and 1 of the
                        superblock.</em>
                </p></td>
        </tr>

        <tr>
            <td><p>Version Number of the Shared Header Message Format</p></td>
            <td><p>This value is used to determine the format of the
                    information in a shared object header message. Since the format of
                    the shared header messages differs from the other private header
                    messages, a version number is used to identify changes in the
                    format.</p>
                <p>
                    The only value currently valid in this field is &lsquo;0&rsquo;,
                    which indicates that shared header messages are formatted as
                    described <a href="#ObjectHeaderMessages">below</a>.
                </p>

                <p>
                    <em>This field is present in version 0 and 1 of the
                        superblock.</em>
                </p></td>
        </tr>

        <tr>
            <td><p>Size of Offsets</p></td>
            <td><p>This value contains the number of bytes used to store
                    addresses in the file. The values for the addresses of objects in
                    the file are offsets relative to a base address, usually the
                    address of the superblock signature. This allows a wrapper to be
                    added after the file is created without invalidating the internal
                    offset locations.</p>

                <p>
                    <em>This field is present in version 0+ of the superblock.</em>
                </p></td>
        </tr>

        <tr>
            <td><p>Size of Lengths</p></td>
            <td><p>This value contains the number of bytes used to store
                    the size of an object.</p>
                <p>
                    <em>This field is present in version 0+ of the superblock.</em>
                </p></td>
        </tr>

        <tr>
            <td><p>Group Leaf Node K</p></td>
            <td>
                <p>Each leaf node of a group B-tree will have at least this many
                    entries but not more than twice this many. If a group has a single
                    leaf node then it may have fewer entries.</p>
                <p>This value must be greater than zero.</p>
                <p>
                    See the <a href="#Btrees">description</a> of B-trees below.
                </p>

                <p>
                    <em>This field is present in version 0 and 1 of the
                        superblock.</em>
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Group Internal Node K</p></td>
            <td>
                <p>Each internal node of a group B-tree will have at least this
                    many entries but not more than twice this many. If the group has
                    only one internal node then it might have fewer entries.</p>
                <p>This value must be greater than zero.</p>
                <p>
                    See the <a href="#Btrees">description</a> of B-trees below.
                </p>

                <p>
                    <em>This field is present in version 0 and 1 of the
                        superblock.</em>
                </p>
            </td>
        </tr>

        <tr>
            <td><p>File Consistency Flags</p></td>
            <td>
                <p>This value contains flags to indicate information about the
                    consistency of the information contained within the file.
                    Currently, the following bit flags are defined:</p>
                <ul>
                    <li>Bit 0 set indicates that the file is opened for
                        write-access.</li>
                    <li>Bit 1 set indicates that the file has been verified for
                        consistency and is guaranteed to be consistent with the format
                        defined in this document.</li>
                    <li>Bits 2-31 are reserved for future use.</li>
                </ul> Bit 0 should be set as the first action when a file is opened for
                write access and should be cleared only as the final action when
                closing a file. Bit 1 should be cleared during normal access to a
                file and only set after the file&rsquo;s consistency is guaranteed
                by the library or a consistency utility.
                <p></p>

                <p>
                    <em>This field is present in version 0+ of the superblock.</em>
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Indexed Storage Internal Node K</p></td>
            <td>
                <p>Each internal node of an indexed storage B-tree will have at
                    least this many entries but not more than twice this many. If the
                    index storage B-tree has only one internal node then it might have
                    fewer entries.</p>
                <p>This value must be greater than zero.</p>
                <p>
                    See the <a href="#Btrees">description</a> of B-trees below.
                </p>

                <p>
                    <em>This field is present in version 1 of the superblock.</em>
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Base Address</p></td>
            <td>
                <p>This is the absolute file address of the first byte of the
                    HDF5 data within the file. The library currently constrains this
                    value to be the absolute file address of the superblock itself when
                    creating new files; future versions of the library may provide
                    greater flexibility. When opening an existing file and this address
                    does not match the offset of the superblock, the library assumes
                    that the entire contents of the HDF5 file have been adjusted in the
                    file and adjusts the base address and end of file address to
                    reflect their new positions in the file. Unless otherwise noted,
                    all other file addresses are relative to this base address.</p>

                <p>
                    <em>This field is present in version 0+ of the superblock.</em>
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Address of Global Free-space Index</p></td>
            <td>
                <p>
                    The file&rsquo;s free space is not persistent for version 0 and 1
                    of the superblock. Currently this field always contains the <a
                        href="#UndefinedAddress">undefined address</a>.
                </p>

                <p>
                    <em>This field is present in version 0 and 1 of the
                        superblock.</em>
                </p>
            </td>
        </tr>

        <tr>
            <td><p>End of File Address</p></td>
            <td>
                <p>This is the absolute file address of the first byte past the
                    end of all HDF5 data. It is used to determine whether a file has
                    been accidentally truncated and as an address where file data
                    allocation can occur if space from the free list is not used.</p>

                <p>
                    <em>This field is present in version 0+ of the superblock.</em>
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Driver Information Block Address</p></td>
            <td>
                <p>
                    This is the relative file address of the file driver information
                    block which contains driver-specific information needed to reopen
                    the file. If there is no driver information block then this entry
                    should be the <a href="#UndefinedAddress">undefined address</a>.
                </p>

                <p>
                    <em>This field is present in version 0 and 1 of the
                        superblock.</em>
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Root Group Symbol Table Entry</p></td>
            <td>
                <p>
                    This is the <a href="#SymbolTableEntry">symbol table entry</a> of
                    the root group, which serves as the entry point into the group
                    graph for the file.
                </p>

                <p>
                    <em>This field is present in version 0 and 1 of the
                        superblock.</em>
                </p>
            </td>
        </tr>
    </table>
</div>

<br />
<p>Version 2 of the superblock is described below:</p>

<div align="center">
    <table class="format">
        <caption>Superblock (Version 2)</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Format Signature (8 bytes)<br />
            <br /></td>
        </tr>

        <tr>
            <td>Version # of Superblock</td>
            <td>Size of Offsets</td>
            <td>Size of Lengths</td>
            <td>File Consistency Flags</td>
        </tr>

        <tr>
            <td colspan="4"><br />Base Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Superblock Extension Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />End of File Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Root Group Object Header Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Superblock Checksum</td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets.&rdquo;)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Format Signature</p></td>
            <td>
                <p>This field is the same as described for versions 0 and 1 of
                    the superblock.</p>
            </td>
        </tr>

        <tr>
            <td><p>Version Number of the Superblock</p></td>
            <td>
                <p>This field has a value of 2 and has the same meaning as for
                    versions 0 and 1.</p>
            </td>
        </tr>

        <tr>
            <td><p>Size of Offsets</p></td>
            <td>
                <p>This field is the same as described for versions 0 and 1 of
                    the superblock.</p>
            </td>
        </tr>

        <tr>
            <td><p>Size of Lengths</p></td>
            <td>
                <p>This field is the same as described for versions 0 and 1 of
                    the superblock.</p>
            </td>
        </tr>

        <tr>
            <td><p>File Consistency Flags</p></td>
            <td>
                <p>This field is the same as described for versions 0 and 1
                    except that it is smaller (the number of reserved bits has been
                    reduced from 30 to 6).</p>
            </td>
        </tr>

        <tr>
            <td><p>Base Address</p></td>
            <td>
                <p>This field is the same as described for versions 0 and 1 of
                    the superblock.</p>
            </td>
        </tr>

        <tr>
            <td><p>Superblock Extension Address</p></td>
            <td>
                <p>
                    The field is the address of the object header for the <a
                        href="#SuperblockExt">superblock extension</a>. If there is no
                    extension then this entry should be the <a href="#UndefinedAddress">undefined
                        address</a>.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>End of File Address</p></td>
            <td>
                <p>This field is the same as described for versions 0 and 1 of
                    the superblock.</p>
            </td>
        </tr>

        <tr>
            <td><p>Root Group Object Header Address</p></td>
            <td>
                <p>
                    This is the address of the <a href="#DataObject">root group
                        object header</a>, which serves as the entry point into the group
                    graph for the file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Superblock Checksum</p></td>
            <td>
                <p>The checksum for the superblock.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<h3>
    <a name="DriverInfo"> II.B. Disk Format: Level 0B - File Driver
        Info</a>
</h3>

<p>
    The <b>driver information block</b> is an optional region of the file
    which contains information needed by the file driver to reopen a file.
    The format is described below:
</p>


<div align="center">
    <table class="format">
        <caption>Driver Information Block</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td colspan="3">Reserved</td>
        </tr>

        <tr>
            <td colspan="4">Driver Information Size</td>
        </tr>

        <tr>
            <td colspan="4"><br />Driver Identification (8 bytes)<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />
            <br />Driver Information (<em>variable size</em>)<br />
            <br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>The version number of the Driver Information Block. This
                    document describes version 0.</p>
            </td>
        </tr>

        <tr>
            <td><p>Driver Information Size</p></td>
            <td>
                <p>
                    The size in bytes of the <em>Driver Information</em> field.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Driver Identification</p></td>
            <td>
                <p>
                    This is an eight-byte ASCII string without null termination which
                    identifies the driver and/or version number of the Driver
                    Information Block. The predefined driver encoded in this field by
                    the HDF5 Library is identified by the letters
                    <code>NCSA</code>
                    followed by the first four characters of the driver name. If the
                    Driver Information block is not the original version then the last
                    letter(s) of the identification will be replaced by a version
                    number in ASCII, starting with 0.
                </p>
                <p>Identification for user-defined drivers is also eight-byte
                    long. It can be arbitrary but should be unique to avoid the four
                    character prefix &ldquo;NCSA&rdquo;.</p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Driver Information</p></td>
            <td>Driver information is stored in a format defined by the file
                driver (see description below).</td>
        </tr>
    </table>
</div>

<br /> The two drivers encoded in the
<em>Driver Identification</em> field are as follows:
<ul>
    <li>Multi driver:
        <p>The identifier for this driver is &ldquo;NCSAmulti&rdquo;. This
            driver provides a mechanism for segregating raw data and different
            types of metadata into multiple files. These files are viewed by the
            library as a single virtual HDF5 file with a single file address. A
            maximum of 6 files will be created for the following data:
            superblock, B-tree, raw data, global heap, local heap, and object
            header. More than one type of data can be written to the same file.</p>
    </li>
    <li>Family driver
        <p>The identifier for this driver is &ldquo;NCSAfami&rdquo; and is
            encoded in this field for library version 1.8 and after. This driver
            is designed for systems that do not support files larger than 2
            gigabytes by splitting the HDF5 file address space across several
            smaller files. It does nothing to segregate metadata and raw data;
            they are mixed in the address space just as they would be in a single
            contiguous file.</p>
    </li>
</ul>
<p>
    The format of the <em>Driver Information</em> field for the above two
    drivers are described below:
</p>

<div align="center">
    <table class="format">
        <caption>Multi Driver Information</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Member Mapping</td>
            <td>Member Mapping</td>
            <td>Member Mapping</td>
            <td>Member Mapping</td>
        </tr>

        <tr>
            <td>Member Mapping</td>
            <td>Member Mapping</td>
            <td>Reserved</td>
            <td>Reserved</td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of Member File 1<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />End of Address for Member File 1<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of Member File 2<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />End of Address for Member File 2<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />... ...<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of Member File N<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />End of Address for Member File N<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Name of Member File 1 <em>(variable
                    size)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Name of Member File 2 <em>(variable
                    size)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />... ...<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Name of Member File N <em>(variable
                    size)</em><br />
            <br /></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Member Mapping</p></td>
            <td><p>These fields are integer values from 1 to 6
                    indicating how the data can be mapped to or merged with another
                    type of data.</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Member Mapping</th>
                        <th width="80%" align="left">Description</th>
                    </tr>
                    <tr>
                        <td align="center">1</td>
                        <td>The superblock data.</td>
                    </tr>
                    <tr>
                        <td align="center">2</td>
                        <td>The B-tree data.</td>
                    </tr>
                    <tr>
                        <td align="center">3</td>
                        <td>The raw data.</td>
                    </tr>
                    <tr>
                        <td align="center">4</td>
                        <td>The global heap data.</td>
                    </tr>
                    <tr>
                        <td align="center">5</td>
                        <td>The local heap data.</td>
                    </tr>
                    <tr>
                        <td align="center">6</td>
                        <td>The object header data.</td>
                    </tr>
                </table>
                <p></p>
                <p>For example, if the third field has the value 3 and all the
                    rest have the value 1, it means there are two files: one for raw
                    data, and one for superblock, B-tree, global heap, local heap, and
                    object header.</p></td>
        </tr>

        <tr>
            <td><p>Reserved</p></td>
            <td><p>These fields are reserved and should always be zero.</p></td>
        </tr>

        <tr>
            <td><p>Address of Member File N</p></td>
            <td><p>This field Specifies the virtual address at which the
                    member file starts.</p>
                <p>N is the number of member files.</p></td>
        </tr>

        <tr>
            <td><p>End of Address for Member File N</p></td>
            <td><p>This field is the end of the allocated address for
                    the member file.</p></td>
        </tr>

        <tr>
            <td><p>Name of Member File N</p></td>
            <td><p>
                    This field is the null-terminated name of the member file and its
                    length should be multiples of 8 bytes. Additional bytes will be
                    padded with <em>NULL</em>s. The default naming convention is <em>%s-X.h5</em>,
                    where <em>X</em> is one of the letters <em>s</em> (for superblock),
                    <em>b</em> (for B-tree), <em>r</em> (for raw data), <em>g</em> (for
                    global heap), <em>l</em> (for local heap), and <em>o</em> (for
                    object header). The name of the whole HDF5 file will substitute the
                    <em>%s</em> in the string.
                </p></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="format">
        <caption>Family Driver Information</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td colspan="8"><br />Size of Member File<br />
            <br /></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Size of Member File</p></td>
            <td><p>This field is the size of the member file in the
                    family of files.</p></td>
        </tr>
    </table>
</div>

<br />
<h3>
    <a name="SuperblockExt"> II.C. Disk Format: Level 0C - Superblock
        Extension</a>
</h3>

<p>
    The <em>superblock extension</em> is used to store superblock metadata
    which is either optional, or added after the version of the superblock
    was defined. Superblock extensions may only exist when version 2+ of
    superblock is used. A superblock extension is an object header which
    may hold the following messages:
</p>
<ul>
    <li><a href="#SOHMTableMessage">Shared Message Table message</a>
        containing information to locate the master table of shared object
        header message indices.</li>
    <li><a href="#BtreeKValuesMessage">B-tree &lsquo;K&rsquo;
            Values message</a> containing non-default B-tree &lsquo;K&rsquo; values.</li>
    <li><a href="#DrvInfoMessage">Driver Info message</a> containing
        information needed by the file driver in order to reopen a file. See
        also the <a href="#DriverInfo">&ldquo;Disk Format: Level 0B - File
            Driver Info&rdquo;</a> section above.</li>
    <li><a href="#FsinfoMessage">File Space Info message</a>
        containing information about file space handling in the file.</li>
</ul>



<br />
<br />
<hr />
<h2>
    <a name="FileInfra"> III. Disk Format: Level 1 - File
        Infrastructure</a>
</h2>

<br />
<h3>
    <a name="Btrees"> III.A. Disk Format: Level 1A - B-trees and B-tree
        Nodes</a>
</h3>

<p>B-trees allow flexible storage for objects which tend to grow in
    ways that cause the object to be stored discontiguously. B-trees are
    described in various algorithms books including &ldquo;Introduction to
    Algorithms&rdquo; by Thomas H. Cormen, Charles E. Leiserson, and Ronald
    L. Rivest. B-trees are used in several places in the HDF5 file format,
    when an index is needed for another data structure.</p>

<p>The version 1 B-tree structure described below is the original
    index structure, but are limited by some bugs in our implementation
    (mainly in how they handle deleting records). The version 1 B-trees are
    being phased out in favor of the version 2 B-trees described below,
    although both types of structures may be found in the same file,
    depending on application settings when creating the file.</p>

<br />
<h4>
    <a name="V1Btrees"> III.A.1. Disk Format: Level 1A1 - Version 1
        B-trees (B-link Trees)</a>
</h4>

<p>
    Version 1 B-trees in HDF5 files an implementation of the B-link tree,
    in which the sibling nodes at a particular level in the tree are stored
    in a doubly-linked list, is described in the &ldquo;Efficient Locking
    for Concurrent Operations on B-trees&rdquo; paper by Phillip Lehman and
    S. Bing Yao as published in the <cite>ACM Transactions on
        Database Systems</cite>, Vol. 6, No. 4, December 1981.
</p>

<p>The B-link trees implemented by the file format contain one more
    key than the number of children. In other words, each child pointer out
    of a B-tree node has a left key and a right key. The pointers out of
    internal nodes point to sub-trees while the pointers out of leaf nodes
    point to symbol nodes and raw data chunks. Aside from that difference,
    internal nodes and leaf nodes are identical.</p>

<div align="center">
    <table class="format">
        <caption>B-link Tree Nodes</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>

        <tr>
            <td>Node Type</td>
            <td>Node Level</td>
            <td colspan="2">Entries Used</td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of Left Sibling<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of Right Sibling<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Key 0 (variable size)</td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of Child 0<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Key 1 (variable size)</td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of Child 1<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">...</td>
        </tr>

        <tr>
            <td colspan="4">Key 2<em>K</em> (variable size)
            </td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of Child 2<em>K</em><sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Key 2<em>K</em>+1 (variable size)
            </td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>TREE</code>
                    &rdquo; is used to indicate the beginning of a B-link tree node.
                    This gives file consistency checking utilities a better chance of
                    reconstructing a damaged file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Node Type</p></td>
            <td>
                <p>
                    Each B-link tree points to a particular type of data. This field
                    indicates the type of data as well as implying the maximum degree <em>K</em>
                    of the tree and the size of each Key field.


                </p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Node Type</th>
                        <th width="80%" align="left">Description</th>
                    </tr>
                    <tr>
                        <td align="center">0</td>
                        <td>This tree points to group nodes.</td>
                    </tr>
                    <tr>
                        <td align="center">1</td>
                        <td>This tree points to raw data chunk nodes.</td>
                    </tr>
                </table>
                <p></p>
            </td>
        </tr>

        <tr>
            <td><p>Node Level</p></td>
            <td>
                <p>The node level indicates the level at which this node appears
                    in the tree (leaf nodes are at level zero). Not only does the level
                    indicate whether child pointers point to sub-trees or to data, but
                    it can also be used to help file consistency checking utilities
                    reconstruct damaged trees.</p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Entries Used</p></td>
            <td>
                <p>This determines the number of children to which this node
                    points. All nodes of a particular type of tree have the same
                    maximum degree, but most nodes will point to less than that number
                    of children. The valid child pointers and keys appear at the
                    beginning of the node and the unused pointers and keys appear at
                    the end of the node. The unused pointers and keys have undefined
                    values.</p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Address of Left Sibling</p></td>
            <td>
                <p>
                    This is the relative file address of the left sibling of the
                    current node. If the current node is the left-most node at this
                    level then this field is the <a href="#UndefinedAddress">undefined
                        address</a>.
                </p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Address of Right Sibling</p></td>
            <td>
                <p>
                    This is the relative file address of the right sibling of the
                    current node. If the current node is the right-most node at this
                    level then this field is the <a href="#UndefinedAddress">undefined
                        address</a>.
                </p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Keys and Child Pointers</p></td>
            <td>
                <p>
                    Each tree has 2<em>K</em>+1 keys with 2<em>K</em> child pointers
                    interleaved between the keys. The number of keys and child pointers
                    actually containing valid values is determined by the node&rsquo;s
                    <em>Entries Used</em> field. If that field is <em>N</em> then the
                    B-link tree contains <em>N</em> child pointers and <em>N</em>+1
                    keys.
                </p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Key</p></td>
            <td>
                <p>
                    The format and size of the key values is determined by the type of
                    data to which this tree points. The keys are ordered and are
                    boundaries for the contents of the child pointer; that is, the key
                    values represented by child <em>N</em> fall between Key <em>N</em>
                    and Key <em>N</em>+1. Whether the interval is open or closed on
                    each end is determined by the type of data to which the tree
                    points.
                </p>

                <p>The format of the key depends on the node type. For nodes of
                    node type 0 (group nodes), the key is formatted as follows:</p>
                <table class="list">
                    <tr>
                        <td width="20%">A single field of <i>Size of Lengths</i>
                            bytes:
                        </td>
                        <td width="80%">Indicates the byte offset into the local heap
                            for the first object name in the subtree which that key
                            describes.</td>
                    </tr>
                </table>
                <p></p>


                <p>For nodes of node type 1 (chunked raw data nodes), the key is
                    formatted as follows:</p>
                <table class="list">
                    <tr>
                        <td width="20%">Bytes 1-4:</td>
                        <td width="80%">Size of chunk in bytes.</td>
                    </tr>
                    <tr>
                        <td>Bytes 4-8:</td>
                        <td>Filter mask, a 32-bit bit field indicating which filters
                            have been skipped for this chunk. Each filter has an index number
                            in the pipeline (starting at 0, with the first filter to apply)
                            and if that filter is skipped, the bit corresponding to its index
                            is set.</td>
                    </tr>
                    <tr>
                        <td>(<em>D + 1</em>) 64-bit fields:
                        </td>
                        <td>The offset of the chunk within the dataset where <i>D</i>
                            is the number of dimensions of the dataset, and the last value is
                            the offset within the dataset&rsquo;s datatype and should always
                            be zero. For example, if a chunk in a 3-dimensional dataset
                            begins at the position <code>[5,5,5]</code>, there will be three
                            such 64-bit values, each with the value of <code>5</code>,
                            followed by a <code>0</code> value.
                        </td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr valign="top">
            <td><p>Child Pointer</p></td>
            <td>
                <p>The tree node contains file addresses of subtrees or data
                    depending on the node level. Nodes at Level 0 point to data
                    addresses, either raw data chunks or group nodes. Nodes at non-zero
                    levels point to other nodes of the same B-tree.</p>
                <p>
                    For raw data chunk nodes, the child pointer is the address of a
                    single raw data chunk. For group nodes, the child pointer points to
                    a <a href="#SymbolTable">symbol table</a>, which contains
                    information for multiple symbol table entries.
                </p>
            </td>
        </tr>
    </table>
</div>

<p>Conceptually, each B-tree node looks like this:</p>
<center>
    <table>
        <tr valign="top" align="center">
            <td>key[0]</td>
            <td>&nbsp;</td>
            <td>child[0]</td>
            <td>&nbsp;</td>
            <td>key[1]</td>
            <td>&nbsp;</td>
            <td>child[1]</td>
            <td>&nbsp;</td>
            <td>key[2]</td>
            <td>&nbsp;</td>
            <td>...</td>
            <td>&nbsp;</td>
            <td>...</td>
            <td>&nbsp;</td>
            <td>key[<i>N</i>-1]
            </td>
            <td>&nbsp;</td>
            <td>child[<i>N</i>-1]
            </td>
            <td>&nbsp;</td>
            <td>key[<i>N</i>]
            </td>
        </tr>
    </table>
</center>
<br /> where child[
<i>i</i>] is a pointer to a sub-tree (at a level above Level 0) or to
data (at Level 0). Each key[
<i>i</i>] describes an
<i>item</i> stored by the B-tree (a chunk or an object of a group node).
The range of values represented by child[
<i>i</i>] is indicated by key[
<i>i</i>] and key[
<i>i</i>+1].


<p>
    The following question must next be answered: &ldquo;Is the value
    described by key[<i>i</i>] contained in child[<i>i</i>-1] or in child[<i>i</i>]?&rdquo;
    The answer depends on the type of tree. In trees for groups (node type
    0) the object described by key[<i>i</i>] is the greatest object
    contained in child[<i>i</i>-1] while in chunk trees (node type 1) the
    chunk described by key[<i>i</i>] is the least chunk in child[<i>i</i>].
</p>

<p>That means that key[0] for group trees is sometimes unused; it
    points to offset zero in the heap, which is always the empty string and
    compares as &ldquo;less-than&rdquo; any valid object name.</p>

<p>
    And key[<i>N</i>] for chunk trees is sometimes unused; it contains a
    chunk offset which compares as &ldquo;greater-than&rdquo; any other
    chunk offset and has a chunk byte size of zero to indicate that it is
    not actually allocated.
</p>

<br />
<h4>
    <a name="V2Btrees"> III.A.2. Disk Format: Level 1A2 - Version 2
        B-trees</a>
</h4>

<p>
    Version 2 B-trees are &ldquo;traditional&rdquo; B-trees, with one major
    difference. Instead of just using a simple pointer (or address in the
    file) to a child of an internal node, the pointer to the child node
    contains two additional pieces of information: the number of records in
    the child node itself, and the total number of records in the child
    node and all its descendants. Storing this additional information
    allows fast array-like indexing to locate the n<sup>th</sup> record in
    the B-tree.
</p>

<p>
    The entry into a version 2 B-tree is a header which contains global
    information about the structure of the B-tree. The <em>root node
        address</em> field in the header points to the B-tree root node, which is
    either an internal or leaf node, depending on the value in the
    header&rsquo;s <em>depth</em> field. An internal node consists of
    records plus pointers to further leaf or internal nodes in the tree. A
    leaf node consists of solely of records. The format of the records
    depends on the B-tree type (stored in the header).
</p>

<div align="center">
    <table class="format">
        <caption>Version 2 B-tree Header</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>

        </tr>
        <tr>
            <td colspan="4">Signature</td>
        </tr>
        <tr>
            <td>Version</td>
            <td>Type</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>
        <tr>
            <td colspan="4">Node Size</td>
        </tr>
        <tr>
            <td colspan="2">Record Size</td>
            <td colspan="2">Depth</td>
        </tr>
        <tr>
            <td>Split Percent</td>
            <td>Merge Percent</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>
        <tr>
            <td colspan="4"><br />Root Node Address<sup>O</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="2">Number of Records in Root Node</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>
        <tr>
            <td colspan="4"><br />Total Number of Records in B-tree<sup>L</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4">Checksum</td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>BTHD</code>
                    &rdquo; is used to indicate the header of a version 2 B-link tree
                    node.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>The version number for this B-tree header. This document
                    describes version 0.</p>
            </td>
        </tr>

        <tr>
            <td><p>Type</p></td>
            <td>
                <p>This field indicates the type of B-tree:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>
                    <tr>
                        <td align="center">0</td>
                        <td>A &ldquo;testing&rdquo; B-tree, this value should <em>not</em>
                            be used for storing records in actual HDF5 files.
                        </td>
                    </tr>
                    <tr>
                        <td align="center">1</td>
                        <td>This B-tree is used for indexing indirectly accessed,
                            non-filtered &lsquo;huge&rsquo; fractal heap objects.</td>
                    </tr>
                    <tr>
                        <td align="center">2</td>
                        <td>This B-tree is used for indexing indirectly accessed,
                            filtered &lsquo;huge&rsquo; fractal heap objects.</td>
                    </tr>
                    <tr>
                        <td align="center">3</td>
                        <td>This B-tree is used for indexing directly accessed,
                            non-filtered &lsquo;huge&rsquo; fractal heap objects.</td>
                    </tr>
                    <tr>
                        <td align="center">4</td>
                        <td>This B-tree is used for indexing directly accessed,
                            filtered &lsquo;huge&rsquo; fractal heap objects.</td>
                    </tr>
                    <tr>
                        <td align="center">5</td>
                        <td>This B-tree is used for indexing the &lsquo;name&rsquo;
                            field for links in indexed groups.</td>
                    </tr>
                    <tr>
                        <td align="center">6</td>
                        <td>This B-tree is used for indexing the &lsquo;creation
                            order&rsquo; field for links in indexed groups.</td>
                    </tr>
                    <tr>
                        <td align="center">7</td>
                        <td>This B-tree is used for indexing shared object header
                            messages.</td>
                    </tr>
                    <tr>
                        <td align="center">8</td>
                        <td>This B-tree is used for indexing the &lsquo;name&rsquo;
                            field for indexed attributes.</td>
                    </tr>
                    <tr>
                        <td align="center">9</td>
                        <td>This B-tree is used for indexing the &lsquo;creation
                            order&rsquo; field for indexed attributes.</td>
                    </tr>
                </table>
                <p></p>
                <p>The format of records for each type is described below.</p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Node Size</p></td>
            <td>
                <p>This is the size in bytes of all B-tree nodes.</p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Record Size</p></td>
            <td>
                <p>This field is the size in bytes of the B-tree record.</p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Depth</p></td>
            <td>
                <p>This is the depth of the B-tree.</p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Split Percent</p></td>
            <td>
                <p>The percent full that a node needs to increase above before
                    it is split.</p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Merge Percent</p></td>
            <td>
                <p>The percent full that a node needs to be decrease below
                    before it is split.</p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Root Node Address</p></td>
            <td>
                <p>
                    This is the address of the root B-tree node. A B-tree with no
                    records will have the <a href="#UndefinedAddress">undefined
                        address</a> in this field.
                </p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Number of Records in Root Node</p></td>
            <td>
                <p>This is the number of records in the root node.</p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Total Number of Records in B-tree</p></td>
            <td>
                <p>This is the total number of records in the entire B-tree.</p>
            </td>
        </tr>

        <tr valign="top">
            <td><p>Checksum</p></td>
            <td>
                <p>This is the checksum for the B-tree header.</p>
            </td>
        </tr>
    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Version 2 B-tree Internal Node</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>
        <tr>
            <td>Version</td>
            <td>Type</td>
            <td colspan="2">Records 0, 1, 2...N-1 <em>(variable size)</em></td>
        </tr>
        <tr>
            <td colspan="4"><br />Child Node Pointer 0<sup>O</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Number of Records N<sub>0</sub> for Child
                Node 0 <em>(variable size)</em></td>
        </tr>
        <tr>
            <td colspan="4"><br />Total Number of Records for Child Node 0
                <em>(optional, variable size)</em></td>
        </tr>
        <tr>
            <td colspan="4"><br />Child Node Pointer 1<sup>O</sup><br />
            <br /></td>
        </tr>
        <td colspan="4"><br />Number of Records N<sub>1</sub> for Child
            Node 1 <em>(variable size)</em></td>
        <tr></tr>
        <tr>
            <td colspan="4"><br />Total Number of Records for Child Node 1
                <em>(optional, variable size)</em></td>
        </tr>
        <tr>
            <td colspan="4">...</td>
        </tr>
        <tr>
            <td colspan="4"><br />Child Node Pointer N<sup>O</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Number of Records N<sub>n</sub> for Child
                Node N <em>(variable size)</em></td>
        </tr>
        <tr>
            <td colspan="4"><br />Total Number of Records for Child Node N
                <em>(optional, variable size)</em></td>
        </tr>
        <tr>
            <td colspan="4">Checksum</td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>
</div>


<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>BTIN</code>
                    &rdquo; is used to indicate the internal node of a B-link tree.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>The version number for this B-tree internal node. This
                    document describes version 0.</p>
            </td>
        </tr>

        <tr>
            <td><p>Type</p></td>
            <td>
                <p>This field is the type of the B-tree node. It should always
                    be the same as the B-tree type in the header.</p>
            </td>
        </tr>

        <tr>
            <td><p>Records</p></td>
            <td>
                <p>The size of this field is determined by the number of records
                    for this node and the record size (from the header). The format of
                    records depends on the type of B-tree.</p>
            </td>
        </tr>

        <tr>
            <td><p>Child Node Pointer</p></td>
            <td>
                <p>This field is the address of the child node pointed to by the
                    internal node.</p>
            </td>
        </tr>

        <tr>
            <td><p>Number of Records in Child Node</p></td>
            <td>
                <p>
                    This is the number of records in the child node pointed to by the
                    corresponding <em>Node Pointer</em>.
                </p>
                <p>The number of bytes used to store this field is determined by
                    the maximum possible number of records able to be stored in the
                    child node.</p>
                <p>The maximum number of records in a child node is computed in
                    the following way:</p>
                <ul>
                    <li>Subtract the fixed size overhead for the child node (for
                        example, its signature, version, checksum, and so on and <em>one</em>
                        pointer triplet of information for the child node (because there
                        is one more pointer triplet than records in each internal node))
                        from the size of nodes for the B-tree.
                    </li>
                    <li>Divide that result by the size of a record plus the
                        pointer triplet of information stored to reach each child node
                        from this node.</li>
                </ul>

                <p></p>
                <p>Note that leaf nodes do not encode any child pointer
                    triplets, so the maximum number of records in a leaf node is just
                    the node size minus the leaf node overhead, divided by the record
                    size.</p>
                <p>
                    Also note that the first level of internal nodes above the leaf
                    nodes do not encode the <em>Total Number of Records in Child
                        Node</em> value in the child pointer triplets (since it is the same as
                    the <em>Number of Records in Child Node</em>), so the maximum
                    number of records in these nodes is computed with the equation
                    above, but using (<em>Child Pointer</em>, <em>Number of
                        Records in Child Node</em>) pairs instead of triplets.
                </p>
                <p>The number of bytes used to encode this field is the least
                    number of bytes required to encode the maximum number of records in
                    a child node value for the child nodes below this level in the
                    B-tree.</p>
                <p>For example, if the maximum number of child records is 123,
                    one byte will be used to encode these values in this node; if the
                    maximum number of child records is 20000, two bytes will be used to
                    encode these values in this node; and so on. The maximum number of
                    bytes used to encode these values is 8 (in other words, an unsigned
                    64-bit integer).</p>
            </td>
        </tr>

        <tr>
            <td><p>Total Number of Records in Child Node</p></td>
            <td>
                <p>
                    This is the total number of records for the node pointed to by the
                    corresponding <em>Node Pointer</em> and all its children. This
                    field exists only in nodes whose depth in the B-tree node is
                    greater than 1 (in other words, the &ldquo;twig&rdquo; internal
                    nodes, just above leaf nodes, do not store this field in their
                    child node pointers).
                </p>
                <p>The number of bytes used to store this field is determined by
                    the maximum possible number of records able to be stored in the
                    child node and its descendants.</p>
                <p>The maximum possible number of records able to be stored in a
                    child node and its descendants is computed iteratively, in the
                    following way: The maximum number of records in a leaf node is
                    computed, then that value is used to compute the maximum possible
                    number of records in the first level of internal nodes above the
                    leaf nodes. Multiplying these two values together determines the
                    maximum possible number of records in child node pointers for the
                    level of nodes two levels above leaf nodes. This process is
                    continued up to any level in the B-tree.</p>
                <p>
                    The number of bytes used to encode this value is computed in the
                    same way as for the <em>Number of Records in Child Node</em> field.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Checksum</p></td>
            <td>
                <p>This is the checksum for this node.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Version 2 B-tree Leaf Node</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>
        <tr>
            <td>Version</td>
            <td>Type</td>
            <td colspan="2">Record 0, 1, 2...N-1 <em>(variable size)</em></td>
        </tr>
        <tr>
            <td colspan="4">Checksum</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>BTLF</code>
                    &ldquo; is used to indicate the leaf node of a version 2 B-link
                    tree.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>The version number for this B-tree leaf node. This document
                    describes version 0.</p>
            </td>
        </tr>

        <tr>
            <td><p>Type</p></td>
            <td>
                <p>This field is the type of the B-tree node. It should always
                    be the same as the B-tree type in the header.</p>
            </td>
        </tr>

        <tr>
            <td><p>Records</p></td>
            <td>
                <p>The size of this field is determined by the number of records
                    for this node and the record size (from the header). The format of
                    records depends on the type of B-tree.</p>
            </td>
        </tr>

        <tr>
            <td><p>Checksum</p></td>
            <td>
                <p>This is the checksum for this node.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<p>The record layout for each stored (in other words, non-testing)
    B-tree type is as follows:</p>

<div align="center">
    <table class="format">
        <caption>Version 2 B-tree, Type 1 Record Layout - Indirectly
            Accessed, Non-Filtered, &lsquo;Huge&rsquo; Fractal Heap Objects</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Huge Object Address<sup>O</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Huge Object Length<sup>L</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Huge Object ID<sup>L</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Huge Object Address</p></td>
            <td>
                <p>The address of the huge object in the file.</p>
            </td>
        </tr>

        <tr>
            <td><p>Huge Object Length</p></td>
            <td>
                <p>The length of the huge object in the file.</p>
            </td>
        </tr>

        <tr>
            <td><p>Huge Object ID</p></td>
            <td>
                <p>The heap ID for the huge object.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Version 2 B-tree, Type 2 Record Layout - Indirectly
            Accessed, Filtered, &lsquo;Huge&rsquo; Fractal Heap Objects</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Filtered Huge Object Address<sup>O</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Filtered Huge Object Length<sup>L</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4">Filter Mask</td>
        </tr>
        <tr>
            <td colspan="4"><br />Filtered Huge Object Memory Size<sup>L</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Huge Object ID<sup>L</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Filtered Huge Object Address</p></td>
            <td>
                <p>The address of the filtered huge object in the file.</p>
            </td>
        </tr>

        <tr>
            <td><p>Filtered Huge Object Length</p></td>
            <td>
                <p>The length of the filtered huge object in the file.</p>
            </td>
        </tr>

        <tr>
            <td><p>Filter Mask</p></td>
            <td>
                <p>A 32-bit bit field indicating which filters have been skipped
                    for this chunk. Each filter has an index number in the pipeline
                    (starting at 0, with the first filter to apply) and if that filter
                    is skipped, the bit corresponding to its index is set.</p>
            </td>
        </tr>

        <tr>
            <td><p>Filtered Huge Object Memory Size</p></td>
            <td>
                <p>The size of the de-filtered huge object in memory.</p>
            </td>
        </tr>

        <tr>
            <td><p>Huge Object ID</p></td>
            <td>
                <p>The heap ID for the huge object.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Version 2 B-tree, Type 3 Record Layout - Directly
            Accessed, Non-Filtered, &lsquo;Huge&rsquo; Fractal Heap Objects</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Huge Object Address<sup>O</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Huge Object Length<sup>L</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Huge Object Address</p></td>
            <td>
                <p>The address of the huge object in the file.</p>
            </td>
        </tr>

        <tr>
            <td><p>Huge Object Length</p></td>
            <td>
                <p>The length of the huge object in the file.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Version 2 B-tree, Type 4 Record Layout - Directly
            Accessed, Filtered, &lsquo;Huge&rsquo; Fractal Heap Objects</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Filtered Huge Object Address<sup>O</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Filtered Huge Object Length<sup>L</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4">Filter Mask</td>
        </tr>
        <tr>
            <td colspan="4"><br />Filtered Huge Object Memory Size<sup>L</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Filtered Huge Object Address</p></td>
            <td>
                <p>The address of the filtered huge object in the file.</p>
            </td>
        </tr>

        <tr>
            <td><p>Filtered Huge Object Length</p></td>
            <td>
                <p>The length of the filtered huge object in the file.</p>
            </td>
        </tr>

        <tr>
            <td><p>Filter Mask</p></td>
            <td>
                <p>A 32-bit bit field indicating which filters have been skipped
                    for this chunk. Each filter has an index number in the pipeline
                    (starting at 0, with the first filter to apply) and if that filter
                    is skipped, the bit corresponding to its index is set.</p>
            </td>
        </tr>

        <tr>
            <td><p>Filtered Huge Object Memory Size</p></td>
            <td>
                <p>The size of the de-filtered huge object in memory.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Version 2 B-tree, Type 5 Record Layout - Link Name
            for Indexed Group</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Hash of Name</td>
        </tr>
        <tr>
            <td colspan="4">ID <em>(bytes 1-4)</em></td>
        </tr>

        <tr>
            <td colspan="3">ID <em>(bytes 5-7)</em></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Hash</p></td>
            <td>
                <p>This field is hash value of the name for the link. The hash
                    value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
                    the link&rsquo;s name.</p>
            </td>
        </tr>

        <tr>
            <td><p>ID</p></td>
            <td>
                <p>This is a 7-byte sequence of bytes and is the heap ID for the
                    link record in the group&rsquo;s fractal heap.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Version 2 B-tree, Type 6 Record Layout - Creation
            Order for Indexed Group</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Creation Order <em>(8 bytes)</em><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4">ID <em>(bytes 1-4)</em></td>
        </tr>
        <tr>
            <td colspan="3">ID <em>(bytes 5-7)</em></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Creation Order</p></td>
            <td>
                <p>This field is the creation order value for the link.</p>
            </td>
        </tr>

        <tr>
            <td><p>ID</p></td>
            <td>
                <p>This is a 7-byte sequence of bytes and is the heap ID for the
                    link record in the group&rsquo;s fractal heap.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Version 2 B-tree, Type 7 Record Layout - Shared
            Object Header Messages (Sub-Type 0 - Message in Heap)</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan>Message Location</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>
        <tr>
            <td colspan="4">Hash</td>
        </tr>
        <tr>
            <td colspan="4">Reference Count</td>
        </tr>
        <tr>
            <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Message Location</p></td>
            <td>
                <p>This field Indicates the location where the message is
                    stored:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>
                    <tr>
                        <td align="center">0</td>
                        <td>Shared message is stored in shared message index heap.</td>
                    </tr>
                    <tr>
                        <td align="center">1</td>
                        <td>Shared message is stored in object header.</td>
                    </tr>
                </table>
                <p></p>
            </td>
        </tr>

        <tr>
            <td><p>Hash</p></td>
            <td>
                <p>This field is hash value of the shared message. The hash
                    value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
                    the shared message.</p>
            </td>
        </tr>

        <tr>
            <td><p>Reference Count</p></td>
            <td>
                <p>The number of objects which reference this message.</p>
            </td>
        </tr>

        <tr>
            <td><p>Heap ID</p></td>
            <td>
                <p>This is an 8-byte sequence of bytes and is the heap ID for
                    the shared message in the shared message index&rsquo;s fractal
                    heap.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Version 2 B-tree, Type 7 Record Layout - Shared
            Object Header Messages (Sub-Type 1 - Message in Object Header)</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan>Message Location</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>
        <tr>
            <td colspan="4">Hash</td>
        </tr>
        <tr>
            <td>Reserved (zero)</td>
            <td>Message Type</td>
            <td colspan="2">Object Header Index</td>
        </tr>
        <tr>
            <td colspan="4"><br />Object Header Address<sup>O</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Message Location</p></td>
            <td>
                <p>This field Indicates the location where the message is
                    stored:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>
                    <tr>
                        <td align="center">0</td>
                        <td>Shared message is stored in shared message index heap.</td>
                    </tr>
                    <tr>
                        <td align="center">1</td>
                        <td>Shared message is stored in object header.</td>
                    </tr>
                </table>
                <p></p>
            </td>
        </tr>

        <tr>
            <td><p>Hash</p></td>
            <td>
                <p>This field is hash value of the shared message. The hash
                    value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
                    the shared message.</p>
            </td>
        </tr>

        <tr>
            <td><p>Message Type</p></td>
            <td>
                <p>The object header message type of the shared message.</p>
            </td>
        </tr>

        <tr>
            <td><p>Object Header Index</p></td>
            <td>
                <p>
                    This field indicates that the shared message is the n<sup>th</sup>
                    message of its type in the specified object header.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Object Header Address</p></td>
            <td>
                <p>The address of the object header containing the shared
                    message.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Version 2 B-tree, Type 8 Record Layout - Attribute
            Name for Indexed Attributes</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan>Message Flags</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>
        <tr>
            <td colspan="4">Creation Order</td>
        </tr>
        <tr>
            <td colspan="4">Hash of Name</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Heap ID</p></td>
            <td>
                <p>This is an 8-byte sequence of bytes and is the heap ID for
                    the attribute in the object&rsquo;s attribute fractal heap.</p>
            </td>
        </tr>

        <tr>
            <td><p>Message Flags</p></td>
            <td><p>The object header message flags for the attribute
                    message.</p></td>
        </tr>

        <tr>
            <td><p>Creation Order</p></td>
            <td>
                <p>This field is the creation order value for the attribute.</p>
            </td>
        </tr>

        <tr>
            <td><p>Hash</p></td>
            <td>
                <p>This field is hash value of the name for the attribute. The
                    hash value is the Jenkins&rsquo; lookup3 checksum algorithm applied
                    to the attribute&rsquo;s name.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Version 2 B-tree, Type 9 Record Layout- Creation
            Order for Indexed Attributes</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan>Message Flags</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>
        <tr>
            <td colspan="4">Creation Order</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Heap ID</p></td>
            <td>
                <p>This is an 8-byte sequence of bytes and is the heap ID for
                    the attribute in the object&rsquo;s attribute fractal heap.</p>
            </td>
        </tr>

        <tr>
            <td><p>Message Flags</p></td>
            <td>
                <p>The object header message flags for the attribute message.</p>
            </td>
        </tr>

        <tr>
            <td><p>Creation Order</p></td>
            <td>
                <p>This field is the creation order value for the attribute.</p>
            </td>
        </tr>

    </table>
</div>


<br />
<h3>
    <a name="SymbolTable"> III.B. Disk Format: Level 1B - Group Symbol
        Table Nodes</a>
</h3>

<p>A group is an object internal to the file that allows arbitrary
    nesting of objects within the file (including other groups). A group
    maps a set of link names in the group to a set of relative file
    addresses of objects in the file. Certain metadata for an object to
    which the group points can be cached in the group&rsquo;s symbol table
    entry in addition to being in the object&rsquo;s header.</p>

<p>An HDF5 object name space can be stored hierarchically by
    partitioning the name into components and storing each component as a
    link in a group. The link for a non-ultimate component points to the
    group containing the next component. The link for the last component
    points to the object being named.</p>

<p>
    One implementation of a group is a collection of symbol table nodes
    indexed by a B-link tree. Each symbol table node contains entries for
    one or more links. If an attempt is made to add a link to an already
    full symbol table node containing 2<em>K</em> entries, then the node is
    split and one node contains <em>K</em> symbols and the other contains <em>K</em>+1
    symbols.
</p>

<div align="center">
    <table class="format">
        <caption>Symbol Table Node (A Leaf of a B-link tree)</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>

        <tr>
            <td>Version Number</td>
            <td>Reserved (zero)</td>
            <td colspan="2">Number of Symbols</td>
        </tr>

        <tr>
            <td colspan="4"><br />
            <br />Group Entries<br />
            <br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>SNOD</code>
                    &rdquo; is used to indicate the beginning of a symbol table node.
                    This gives file consistency checking utilities a better chance of
                    reconstructing a damaged file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version Number</p></td>
            <td>
                <p>The version number for the symbol table node. This document
                    describes version 1. (There is no version &lsquo;0&rsquo; of the
                    symbol table node)</p>
            </td>
        </tr>

        <tr>
            <td><p>Number of Entries</p></td>
            <td>
                <p>Although all symbol table nodes have the same length, most
                    contain fewer than the maximum possible number of link entries.
                    This field indicates how many entries contain valid data. The valid
                    entries are packed at the beginning of the symbol table node while
                    the remaining entries contain undefined values.</p>
            </td>
        </tr>

        <tr>
            <td><p>Symbol Table Entries</p></td>
            <td>
                <p>
                    Each link has an entry in the symbol table node. The format of the
                    entry is described below. There are 2<em>K</em> entries in each
                    group node, where <em>K</em> is the &ldquo;Group Leaf Node K&rdquo;
                    value from the <a href="#Superblock">superblock</a>.
                </p>
            </td>
        </tr>
    </table>
</div>

<br />
<h3>
    <a name="SymbolTableEntry"> III.C. Disk Format: Level 1C - Symbol
        Table Entry </a>
</h3>

<p>Each symbol table entry in a symbol table node is designed to
    allow for very fast browsing of stored objects. Toward that design
    goal, the symbol table entries include space for caching certain
    constant metadata from the object header.</p>

<div align="center">
    <table class="format">
        <caption>Symbol Table Entry</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Link Name Offset<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Object Header Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Cache Type</td>
        </tr>

        <tr>
            <td colspan="4">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4"><br />
            <br />Scratch-pad Space (16 bytes)<br />
            <br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Link Name Offset</p></td>
            <td>
                <p>This is the byte offset into the group&rsquo;s local heap for
                    the name of the link. The name is null terminated.</p>
            </td>
        </tr>

        <tr>
            <td><p>Object Header Address</p></td>
            <td>
                <p>Every object has an object header which serves as a permanent
                    location for the object&rsquo;s metadata. In addition to appearing
                    in the object header, some of the object&rsquo;s metadata can be
                    cached in the scratch-pad space.</p>
            </td>
        </tr>

        <tr>
            <td><p>Cache Type</p></td>
            <td>
                <p>The cache type is determined from the object header. It also
                    determines the format for the scratch-pad space:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Type</th>
                        <th width="80%" align="left">Description</th>
                    </tr>
                    <tr>
                        <td align="center">0</td>
                        <td>No data is cached by the group entry. This is guaranteed
                            to be the case when an object header has a link count greater
                            than one.</td>
                    </tr>
                    <tr>
                        <td align="center">1</td>
                        <td>Group object header metadata is cached in the scratch-pad
                            space. This implies that the symbol table entry refers to another
                            group.</td>
                    </tr>
                    <tr>
                        <td align="center">2</td>
                        <td>The entry is a symbolic link. The first four bytes of the
                            scratch-pad space are the offset into the local heap for the link
                            value. The object header address will be undefined.</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Reserved</p></td>
            <td>
                <p>These four bytes are present so that the scratch-pad space is
                    aligned on an eight-byte boundary. They are always set to zero.</p>
            </td>
        </tr>

        <tr>
            <td><p>Scratch-pad Space</p></td>
            <td>
                <p>This space is used for different purposes, depending on the
                    value of the Cache Type field. Any metadata about an object
                    represented in the scratch-pad space is duplicated in the object
                    header for that object.</p>
                <p>Furthermore, no data is cached in the group entry scratch-pad
                    space if the object header for the object has a link count greater
                    than one.</p>
            </td>
        </tr>
    </table>
</div>

<br />
<h4>Format of the Scratch-pad Space</h4>

<p>The symbol table entry scratch-pad space is formatted according
    to the value in the Cache Type field.</p>

<p>
    If the Cache Type field contains the value zero
    <code>(0)</code>
    then no information is stored in the scratch-pad space.
</p>

<p>
    If the Cache Type field contains the value one
    <code>(1)</code>
    , then the scratch-pad space contains cached metadata for another
    object header in the following format:
</p>

<div align="center">
    <table class="format">
        <caption>Object Header Scratch-pad Format</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Address of B-tree<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of Name Heap<sup>O</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Address of B-tree</p></td>
            <td>
                <p>This is the file address for the root of the group&rsquo;s
                    B-tree.</p>
            </td>
        </tr>

        <tr>
            <td><p>Address of Name Heap</p></td>
            <td>
                <p>This is the file address for the group&rsquo;s local heap, in
                    which are stored the group&rsquo;s symbol names.</p>
            </td>
        </tr>
    </table>
</div>


<br />
<p>
    If the Cache Type field contains the value two
    <code>(2)</code>
    , then the scratch-pad space contains cached metadata for a symbolic
    link in the following format:
</p>

<div align="center">
    <table class="format">
        <caption>Symbolic Link Scratch-pad Format</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Offset to Link Value</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Offset to Link Value</p></td>
            <td>
                <p>The value of a symbolic link (that is, the name of the thing
                    to which it points) is stored in the local heap. This field is the
                    4-byte offset into the local heap for the start of the link value,
                    which is null terminated.</p>
            </td>
        </tr>
    </table>
</div>

<br />
<h3>
    <a name="LocalHeap"> III.D. Disk Format: Level 1D - Local Heaps</a>
</h3>

<p>A local heap is a collection of small pieces of data that are
    particular to a single object in the HDF5 file. Objects can be inserted
    and removed from the heap at any time. The address of a heap does not
    change once the heap is created. For example, a group stores addresses
    of objects in symbol table nodes with the names of links stored in the
    group&rsquo;s local heap.</p>

<div align="center">
    <table class="format">
        <caption>Local Heap</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>

        <tr>
            <td>Version</td>
            <td colspan="3">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4"><br />Data Segment Size<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Offset to Head of Free-list<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of Data Segment<sup>O</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>HEAP</code>
                    &rdquo; is used to indicate the beginning of a heap. This gives
                    file consistency checking utilities a better chance of
                    reconstructing a damaged file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>Each local heap has its own version number so that new heaps
                    can be added to old files. This document describes version zero (0)
                    of the local heap.</p>
            </td>
        </tr>

        <tr>
            <td><p>Data Segment Size</p></td>
            <td>
                <p>The total amount of disk memory allocated for the heap data.
                    This may be larger than the amount of space required by the objects
                    stored in the heap. The extra unused space in the heap holds a
                    linked list of free blocks.</p>
            </td>
        </tr>

        <tr>
            <td><p>Offset to Head of Free-list</p></td>
            <td>
                <p>
                    This is the offset within the heap data segment of the first free
                    block (or the <a href="#UndefinedAddress">undefined address</a> if
                    there is no free block). The free block contains &ldquo;Size of
                    Lengths&rdquo; bytes that are the offset of the next free block (or
                    the value &lsquo;1&rsquo; if this is the last free block) followed
                    by &ldquo;Size of Lengths&rdquo; bytes that store the size of this
                    free block. The size of the free block includes the space used to
                    store the offset of the next free block and the size of the current
                    block, making the minimum size of a free block 2 * &ldquo;Size of
                    Lengths&rdquo;.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Address of Data Segment</p></td>
            <td>
                <p>The data segment originally starts immediately after the heap
                    header, but if the data segment must grow as a result of adding
                    more objects, then the data segment may be relocated, in its
                    entirety, to another part of the file.</p>
            </td>
        </tr>
    </table>
</div>

<p>Objects within a local heap should be aligned on an 8-byte
    boundary.</p>

<br />
<h3>
    <a name="GlobalHeap"> III.E. Disk Format: Level 1E - Global Heap</a>
</h3>

<p>Each HDF5 file has a global heap which stores various types of
    information which is typically shared between datasets. The global heap
    was designed to satisfy these goals:</p>

<ol type="A">
    <li>Repeated access to a heap object must be efficient without
        resulting in repeated file I/O requests. Since global heap objects
        will typically be shared among several datasets, it is probable that
        the object will be accessed repeatedly.</li>
    <li>Collections of related global heap objects should result in
        fewer and larger I/O requests. For instance, a dataset of object
        references will have a global heap object for each reference. Reading
        the entire set of object references should result in a few large I/O
        requests instead of one small I/O request for each reference.</li>
    <li>It should be possible to remove objects from the global heap
        and the resulting file hole should be eligible to be reclaimed for
        other uses.</li>
</ol>


<p>
    The implementation of the heap makes use of the memory management
    already available at the file level and combines that with a new object
    called a <em>collection</em> to achieve goal B. The global heap is the
    set of all collections. Each global heap object belongs to exactly one
    collection and each collection contains one or more global heap
    objects. For the purposes of disk I/O and caching, a collection is
    treated as an atomic object, addressing goal A.
</p>

<p>When a global heap object is deleted from a collection (which
    occurs when its reference count falls to zero), objects located after
    the deleted object in the collection are packed down toward the
    beginning of the collection and the collection&rsquo;s global heap
    object 0 is created (if possible) or its size is increased to account
    for the recently freed space. There are no gaps between objects in each
    collection, with the possible exception of the final space in the
    collection, if it is not large enough to hold the header for the
    collection&rsquo;s global heap object 0. These features address goal C.
</p>

<p>The HDF5 Library creates global heap collections as needed, so
    there may be multiple collections throughout the file. The set of all
    of them is abstractly called the &ldquo;global heap&rdquo;, although
    they do not actually link to each other, and there is no global place
    in the file where you can discover all of the collections. The
    collections are found simply by finding a reference to one through
    another object in the file. For example, data of variable-length
    datatype elements is stored in the global heap and is accessed via a
    global heap ID. The format for global heap IDs is described at the end
    of this section.</p>

<div align="center">
    <table class="format">
        <caption>A Global Heap Collection</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>

        <tr>
            <td>Version</td>
            <td colspan="3">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4"><br />Collection Size<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Global Heap Object 1<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Global Heap Object 2<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />...<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Global Heap Object <em>N</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Global Heap Object 0 (free space)<br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;L&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Lengths&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>GCOL</code>
                    &rdquo; is used to indicate the beginning of a collection. This
                    gives file consistency checking utilities a better chance of
                    reconstructing a damaged file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>Each collection has its own version number so that new
                    collections can be added to old files. This document describes
                    version one (1) of the collections (there is no version zero (0)).
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Collection Size</p></td>
            <td>
                <p>This is the size in bytes of the entire collection including
                    this field. The default (and minimum) collection size is 4096 bytes
                    which is a typical file system block size. This allows for 127
                    16-byte heap objects plus their overhead (the collection header of
                    16 bytes and the 16 bytes of information about each heap object).</p>
            </td>
        </tr>

        <tr>
            <td><p>
                    Global Heap Object 1 through <em>N</em>
                </p></td>
            <td>
                <p>The objects are stored in any order with no intervening
                    unused space.</p>
            </td>
        </tr>

        <tr>
            <td><p>Global Heap Object 0</p></td>
            <td>
                <p>Global Heap Object 0 (zero), when present, represents the
                    free space in the collection. Free space always appears at the end
                    of the collection. If the free space is too small to store the
                    header for Object 0 (described below) then the header is implied
                    and the collection contains no free space.</p>
            </td>
        </tr>
    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Global Heap Object</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="2">Heap Object Index</td>
            <td colspan="2">Reference Count</td>
        </tr>

        <tr>
            <td colspan="4">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4"><br />Object Size<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Object Data<br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;L&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Lengths&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Heap Object Index</p></td>
            <td>
                <p>
                    Each object has a unique identification number within a collection.
                    The identification numbers are chosen so that new objects have the
                    smallest value possible with the exception that the identifier
                    <code>0</code>
                    always refers to the object which represents all free space within
                    the collection.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Reference Count</p></td>
            <td>
                <p>All heap objects have a reference count field. An object
                    which is referenced from some other part of the file will have a
                    positive reference count. The reference count for Object 0 is
                    always zero.</p>
            </td>
        </tr>

        <tr>
            <td><p>Reserved</p></td>
            <td>
                <p>Zero padding to align next field on an 8-byte boundary.</p>
            </td>
        </tr>

        <tr>
            <td><p>Object Size</p></td>
            <td>
                <p>This is the size of the object data stored for the object.
                    The actual storage space allocated for the object data is rounded
                    up to a multiple of eight.</p>
            </td>
        </tr>

        <tr>
            <td><p>Object Data</p></td>
            <td>
                <p>The object data is treated as a one-dimensional array of
                    bytes to be interpreted by the caller.</p>
            </td>
        </tr>
    </table>

</div>

<br />
<p>The format for the ID used to locate an object in the global heap
    is described here:</p>

<div align="center">
    <table class="format">
        <caption>Global Heap ID</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Collection Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Object Index</td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Collection Address</p></td>
            <td>
                <p>This field is the address of the global heap collection where
                    the data object is stored.</p>
            </td>
        </tr>

        <tr>
            <td><p>ID</p></td>
            <td>
                <p>This field is the index of the data object within the global
                    heap collection.</p>
            </td>
        </tr>

    </table>
</div>


<br />
<h3>
    <a name="FractalHeap"> III.F. Disk Format: Level 1F - Fractal Heap</a>
</h3>

<p>
    Each fractal heap consists of a header and zero or more direct and
    indirect blocks (described below). The header contains general
    information as well as initialization parameters for the doubling
    table. The <em>Root Block Address</em> in the header points to the
    first direct or indirect block in the heap.
</p>

<p>
    Fractal heaps are based on a data structure called a <em>doubling
        table</em>. A doubling table provides a mechanism for quickly extending an
    array-like data structure that minimizes the number of empty blocks in
    the heap, while retaining very fast lookup of any element within the
    array. More information on fractal heaps and doubling tables can be
    found in the RFC &ldquo;<a
        href="Supplements/FractalHeap/PrivateHeap.pdf">Private Heaps in
        HDF5</a>.&rdquo;
</p>

<p>The fractal heap implements the doubling table structure with
    indirect and direct blocks. Indirect blocks in the heap do not actually
    contain data for objects in the heap, their &ldquo;size&rdquo; is
    abstract - they represent the indexing structure for locating the
    direct blocks in the doubling table. Direct blocks contain the actual
    data for objects stored in the heap.</p>

<p>
    All indirect blocks have a constant number of block entries in each
    row, called the <em>width</em> of the doubling table (stored in the
    heap header). The number of rows for each indirect block in the heap is
    determined by the size of the block that the indirect block represents
    in the doubling table (calculation of this is shown below) and is
    constant, except for the &ldquo;root&rdquo; indirect block, which
    expands and shrinks its number of rows as needed.
</p>

<p>
    Blocks in the first <em>two</em> rows of an indirect block are <em>Starting
        Block Size</em> number of bytes in size, and the blocks in each subsequent
    row are twice the size of the blocks in the previous row. In other
    words, blocks in the third row are twice the <em>Starting Block
        Size</em>, blocks in the fourth row are four times the <em>Starting
        Block Size</em>, and so on. Entries for blocks up to the <em>Maximum
        Direct Block Size</em> point to direct blocks, and entries for blocks
    greater than that size point to further indirect blocks (which have
    their own entries for direct and indirect blocks).
</p>

<p>
    The number of rows of blocks, <em>nrows</em>, in an indirect block of
    size <em>iblock_size</em> is given by the following expression: <br />
    <br /> <em>nrows</em> = (log<sub>2</sub>(<em>iblock_size</em>) - log<sub>2</sub>(<em>&lt;Starting
        Block Size&gt;</em> * <em>&lt;Width&gt;</em>)) + 1
</p>

<p>
    The maximum number of rows of direct blocks, <em>max_dblock_rows</em>,
    in any indirect block of a fractal heap is given by the following
    expression: <br /> <br /> <em>max_dblock_rows</em> = (log<sub>2</sub>(<em>&lt;Max.
        Direct Block Size&gt;</em>) - log<sub>2</sub>(<em>&lt;Starting Block
        Size&gt;</em>)) + 2
</p>

<p>
    Using the computed values for <em>nrows</em> and <em>max_dblock_rows</em>,
    along with the <em>Width</em> of the doubling table, the number of
    direct and indirect block entries (<em>K</em> and <em>N</em> in the
    indirect block description, below) in an indirect block can be
    computed: <br /> <br /> <em>K</em> = MIN(<em>nrows</em>, <em>max_dblock_rows</em>)
    * <em>Width</em> <br /> <br /> If <em>nrows</em> is less than or
    equal to <em>max_dblock_rows</em>, <em>N</em> is 0. Otherwise, <em>N</em>
    is simply computed: <br /> <br /> <em>N</em> = <em>K</em> - (<em>max_dblock_rows</em>
    * <em>Width</em>)
</p>

<p>The size indirect blocks on disk is determined by the number of
    rows in the indirect block (computed above). The size of direct blocks
    on disk is exactly the size of the block in the doubling table.</p>

<div align="center">
    <table class="format">
        <caption>Fractal Heap Header</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>

        <tr>
            <td>Version</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="2">Heap ID Length</td>
            <td colspan="2">I/O Filters&rsquo; Encoded Length</td>
        </tr>

        <tr>
            <td>Flags</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Maximum Size of Managed Objects</td>
        </tr>

        <tr>
            <td colspan="4"><br />Next Huge Object ID<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />v2 B-tree Address of Huge Objects<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Amount of Free Space in Managed Blocks<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of Managed Block Free Space
                Manager<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Amount of Managed Space in Heap<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Amount of Allocated Managed Space in Heap<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Offset of Direct Block Allocation
                Iterator in Managed Space<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Number of Managed Objects in Heap<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Size of Huge Objects in Heap<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Number of Huge Objects in Heap<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Size of Tiny Objects in Heap<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Number of Tiny Objects in Heap<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="2">Table Width</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Starting Block Size<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Maximum Direct Block Size<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="2">Maximum Heap Size</td>
            <td colspan="2">Starting # of Rows in Root Indirect Block</td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of Root Block<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="2">Current # of Rows in Root Indirect Block</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Size of Filtered Root Direct Block <em>(optional)</em><sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">I/O Filter Mask<em> (optional)</em></td>
        </tr>

        <tr>
            <td colspan="4">I/O Filter Information<em> (optional,
                    variable size)</em></td>
        </tr>

        <tr>
            <td colspan="4">Checksum</td>
        </tr>

    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="40%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>FRHP</code>
                    &rdquo; is used to indicate the beginning of a fractal heap header.
                    This gives file consistency checking utilities a better chance of
                    reconstructing a damaged file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>This document describes version 0.</p>
            </td>
        </tr>

        <tr>
            <td><p>Heap ID Length</p></td>
            <td>
                <p>This is the length in bytes of heap object IDs for this heap.</p>
            </td>
        </tr>

        <tr>
            <td><p>I/O Filters&rsquo; Encoded Length</p></td>
            <td>
                <p>
                    This is the size in bytes of the encoded <em>I/O Filter
                        Information</em>.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Flags</p></td>
            <td>
                <p>This field is the heap status flag and is a bit field
                    indicating additional information about the fractal heap.</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit(s)</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>If set, the ID value to use for huge object has wrapped
                            around. If the value for the <em>Next Huge Object ID</em> has
                            wrapped around, each new huge object inserted into the heap will
                            require a search for an ID value.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>If set, the direct blocks in the heap are checksummed.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>2-7</code></td>
                        <td>Reserved</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Maximum Size of Managed Objects</p></td>
            <td>
                <p>This is the maximum size of managed objects allowed in the
                    heap. Objects greater than this this are &lsquo;huge&rsquo; objects
                    and will be stored in the file directly, rather than in a direct
                    block for the heap.</p>
            </td>
        </tr>

        <tr>
            <td><p>Next Huge Object ID</p></td>
            <td>
                <p>This is the next ID value to use for a huge object in the
                    heap.</p>
            </td>
        </tr>

        <tr>
            <td><p>v2 B-tree Address of Huge Objects</p></td>
            <td>
                <p>
                    This is the address of the <a href="#V2Btrees">v2 B-tree</a> used
                    to track huge objects in the heap. The type of records stored in
                    the <em>v2 B-tree</em> will be determined by whether the address &
                    length of a huge object can fit into a heap ID (if yes, it is a
                    &ldquo;directly&rdquo; accessed huge object) and whether there is a
                    filter used on objects in the heap.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Amount of Free Space in Managed Blocks</p></td>
            <td>
                <p>This is the total amount of free space in managed direct
                    blocks (in bytes).</p>
            </td>
        </tr>

        <tr>
            <td><p>Address of Managed Block Free Space Manager</p></td>
            <td>
                <p>
                    This is the address of the <em><a href="#FreeSpaceManager">Free-space
                            Manager</a></em> for managed blocks.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Amount of Managed Space in Heap</p></td>
            <td>
                <p>This is the total amount of managed space in the heap (in
                    bytes), essentially the upper bound of the heap&rsquo;s linear
                    address space.</p>
            </td>
        </tr>

        <tr>
            <td><p>Amount of Allocated Managed Space in Heap</p></td>
            <td>
                <p>
                    This is the total amount of managed space (in bytes) actually
                    allocated in the heap. This can be less than the <em>Amount of
                        Managed Space in Heap</em> field, if some direct blocks in the
                    heap&rsquo;s linear address space are not allocated.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Offset of Direct Block Allocation Iterator in Managed
                    Space</p></td>
            <td>
                <p>
                    This is the linear heap offset where the next direct block should
                    be allocated at (in bytes). This may be less than the <em>Amount
                        of Managed Space in Heap</em> value because the heap&rsquo;s address
                    space is increased by a &ldquo;row&rdquo; of direct blocks at a
                    time, rather than by single direct block increments.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Number of Managed Objects in Heap</p></td>
            <td>
                <p>This is the number of managed objects in the heap.</p>
            </td>
        </tr>

        <tr>
            <td><p>Size of Huge Objects in Heap</p></td>
            <td>
                <p>This is the total size of huge objects in the heap (in
                    bytes).</p>
            </td>
        </tr>

        <tr>
            <td><p>Number of Huge Objects in Heap</p></td>
            <td>
                <p>This is the number of huge objects in the heap.</p>
            </td>
        </tr>

        <tr>
            <td><p>Size of Tiny Objects in Heap</p></td>
            <td>
                <p>This is the total size of tiny objects that are packed in
                    heap IDs (in bytes).</p>
            </td>
        </tr>

        <tr>
            <td><p>Number of Tiny Objects in Heap</p></td>
            <td>
                <p>This is the number of tiny objects that are packed in heap
                    IDs.</p>
            </td>
        </tr>

        <tr>
            <td><p>Table Width</p></td>
            <td>
                <p>This is the number of columns in the doubling table for
                    managed blocks. This value must be a power of two.</p>
            </td>
        </tr>

        <tr>
            <td><p>Starting Block Size</p></td>
            <td>
                <p>This is the starting block size to use in the doubling table
                    for managed blocks (in bytes). This value must be a power of two.</p>
            </td>
        </tr>

        <tr>
            <td><p>Maximum Direct Block Size</p></td>
            <td>
                <p>This is the maximum size allowed for a managed direct block.
                    Objects inserted into the heap that are larger than this value
                    (less the # of bytes of direct block prefix/suffix) are stored as
                    &lsquo;huge&rsquo; objects. This value must be a power of two.</p>
            </td>
        </tr>

        <tr>
            <td><p>Maximum Heap Size</p></td>
            <td>
                <p>This is the maximum size of the heap&rsquo;s linear address
                    space for managed objects (in bytes). The value stored is the log2
                    of the actual value, that is: the # of bits of the address space.
                    &lsquo;Huge&rsquo; and &lsquo;tiny&rsquo; objects are not counted
                    in this value, since they do not store objects in the linear
                    address space of the heap.</p>
            </td>
        </tr>

        <tr>
            <td><p>Starting # of Rows in Root Indirect Block</p></td>
            <td>
                <p>
                    This is the starting number of rows for the root indirect block. A
                    value of 0 indicates that the root indirect block will have the
                    maximum number of rows needed to address the heap&rsquo;s <em>Maximum
                        Heap Size</em>.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Address of Root Block</p></td>
            <td>
                <p>
                    This is the address of the root block for the heap. It can be the <a
                        href="#UndefinedAddress">undefined address</a> if there is no data
                    in the heap. It either points to a direct block (if the <em>Current
                        # of Rows in the Root Indirect Block</em> value is 0), or an indirect
                    block.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Current # of Rows in Root Indirect Block</p></td>
            <td>
                <p>
                    This is the current number of rows in the root indirect block. A
                    value of 0 indicates that <em>Address of Root Block</em> points to
                    direct block instead of indirect block.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Size of Filtered Root Direct Block</p></td>
            <td>
                <p>
                    This is the size of the root direct block, if filters are applied
                    to heap objects (in bytes). This field is only stored in the header
                    if the <em>I/O Filters&rsquo; Encoded Length</em> is greater than
                    0.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>I/O Filter Mask</p></td>
            <td>
                <p>
                    This is the filter mask for the root direct block, if filters are
                    applied to heap objects. This mask has the same format as that used
                    for the filter mask in chunked raw data records in a <a
                        href="#V1Btrees">v1 B-tree</a>. This field is only stored in the
                    header if the <em>I/O Filters&rsquo; Encoded Length</em> is greater
                    than 0.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>I/O Filter Information</p></td>
            <td>
                <p>
                    This is the I/O filter information encoding direct blocks and huge
                    objects, if filters are applied to heap objects. This field is
                    encoded as a <a href="#FilterMessage">Filter Pipeline</a> message.
                    The size of this field is determined by <em>I/O Filters&rsquo;
                        Encoded Length</em>.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Checksum</p></td>
            <td>
                <p>This is the checksum for the header.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Fractal Heap Direct Block</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>

        <tr>
            <td>Version</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Heap Header Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Block Offset <em>(variable size)</em></td>
        </tr>

        <tr>
            <td colspan="4">Checksum <em>(optional)</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Object Data <em>(variable size)</em><br />
            <br /></td>
        </tr>

    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>FHDB</code>
                    &rdquo; is used to indicate the beginning of a fractal heap direct
                    block. This gives file consistency checking utilities a better
                    chance of reconstructing a damaged file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>This document describes version 0.</p>
            </td>
        </tr>

        <tr>
            <td><p>Heap Header Address</p></td>
            <td>
                <p>This is the address for the fractal heap header that this
                    block belongs to. This field is principally used for file integrity
                    checking.</p>
            </td>
        </tr>

        <tr>
            <td><p>Block Offset</p></td>
            <td>
                <p>
                    This is the offset of the block within the fractal heap&rsquo;s
                    address space (in bytes). The number of bytes used to encode this
                    field is the <em>Maximum Heap Size</em> (in the heap&rsquo;s
                    header) divided by 8 and rounded up to the next highest integer,
                    for values that are not a multiple of 8. This value is principally
                    used for file integrity checking.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Checksum</p></td>
            <td>
                <p>This is the checksum for the direct block.</p>
                <p>
                    This field is only present if bit 1 of <em>Flags</em> in the
                    heap&rsquo;s header is set.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Object Data</p></td>
            <td>
                <p>
                    This section of the direct block stores the actual data for objects
                    in the heap. The size of this section is determined by the direct
                    block&rsquo;s size minus the size of the other fields stored in the
                    direct block (for example, the <em>Signature</em>, <em>Version</em>,
                    and others including the <em>Checksum</em> if it is present).
                </p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Fractal Heap Indirect Block</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>

        <tr>
            <td>Version</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Heap Header Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Block Offset <em>(variable size)</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Child Direct Block #0 Address<sup>O</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Size of Filtered Direct Block #0 <em>(optional)</em>
                <sup>L</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4">Filter Mask for Direct Block #0 <em>(optional)</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Child Direct Block #1 Address<sup>O</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Size of Filtered Direct Block #1 <em>(optional)</em><sup>L</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4">Filter Mask for Direct Block #1 <em>(optional)</em></td>
        </tr>

        <tr>
            <td colspan="4">...</td>
        </tr>

        <tr>
            <td colspan="4"><br />Child Direct Block #K-1 Address<sup>O</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Size of Filtered Direct Block #K-1 <em>(optional)</em><sup>L</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4">Filter Mask for Direct Block #K-1 <em>(optional)</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Child Indirect Block #0 Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Child Indirect Block #1 Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">...</td>
        </tr>

        <tr>
            <td colspan="4"><br />Child Indirect Block #N-1 Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Checksum</td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>FHIB</code>
                    &rdquo; is used to indicate the beginning of a fractal heap
                    indirect block. This gives file consistency checking utilities a
                    better chance of reconstructing a damaged file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>This document describes version 0.</p>
            </td>
        </tr>

        <tr>
            <td><p>Heap Header Address</p></td>
            <td>
                <p>This is the address for the fractal heap header that this
                    block belongs to. This field is principally used for file integrity
                    checking.</p>
            </td>
        </tr>

        <tr>
            <td><p>Block Offset</p></td>
            <td>
                <p>
                    This is the offset of the block within the fractal heap&rsquo;s
                    address space (in bytes). The number of bytes used to encode this
                    field is the <em>Maximum Heap Size</em> (in the heap&rsquo;s
                    header) divided by 8 and rounded up to the next highest integer,
                    for values that are not a multiple of 8. This value is principally
                    used for file integrity checking.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Child Direct Block #K Address</p></td>
            <td>
                <p>This field is the address of the child direct block. The size
                    of the [uncompressed] direct block can be computed by its offset in
                    the heap&rsquo;s linear address space.</p>
            </td>
        </tr>

        <tr>
            <td><p>Size of Filtered Direct Block #K</p></td>
            <td>
                <p>This is the size of the child direct block after passing
                    through the I/O filters defined for this heap (in bytes). If no I/O
                    filters are present for this heap, this field is not present.</p>
            </td>
        </tr>
        <tr>
            <td><p>Filter Mask for Direct Block #K</p></td>
            <td>
                <p>
                    This is the I/O filter mask for the filtered direct block. This
                    mask has the same format as that used for the filter mask in
                    chunked raw data records in a <a href="#V1Btrees">v1 B-tree</a>. If
                    no I/O filters are present for this heap, this field is not
                    present.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Child Indirect Block #N Address</p></td>
            <td>
                <p>This field is the address of the child indirect block. The
                    size of the indirect block can be computed by its offset in the
                    heap&rsquo;s linear address space.</p>
            </td>
        </tr>

        <tr>
            <td><p>Checksum</p></td>
            <td>
                <p>This is the checksum for the indirect block.</p>
            </td>
        </tr>

    </table>

</div>

<br />
<p>An object in the fractal heap is identified by means of a fractal
    heap ID, which encodes information to locate the object in the heap.
    Currently, the fractal heap stores an object in one of three ways,
    depending on the object&rsquo;s size:</p>

<div align="center">
    <table class="list80">
        <tr>
            <th width="20%">Type</th>
            <th width="80%" align="left">Description</th>
        </tr>

        <tr>
            <td align="center">Tiny</td>
            <td>
                <p>When an object is small enough to be encoded in the heap ID,
                    the object&rsquo;s data is embedded in the fractal heap ID itself.
                    There are 2 sub-types for this type of object: normal and extended.
                    The sub-type for tiny heap IDs depends on whether the heap ID is
                    large enough to store objects greater than 16 bytes or not. If the
                    heap ID length is 18 bytes or smaller, the &lsquo;normal&rsquo;
                    tiny heap ID form is used. If the heap ID length is greater than 18
                    bytes in length, the &ldquo;extended&rdquo; form is used. See
                    format description below for both sub-types.</p>
            </td>
        </tr>

        <tr>
            <td align="center">Huge</td>
            <td>
                <p>
                    When the size of an object is larger than <em>Maximum Size of
                        Managed Objects</em> in the <em>Fractal Heap Header</em>, the
                    object&rsquo;s data is stored on its own in the file and the object
                    is tracked/indexed via a version 2 B-tree. All huge objects for a
                    particular fractal heap use the same v2 B-tree. All huge objects
                    for a particular fractal heap use the same format for their huge
                    object IDs.
                </p>

                <p>Depending on whether the IDs for a heap are large enough to
                    hold the object&rsquo;s retrieval information and whether I/O
                    pipeline filters are applied to the heap&rsquo;s objects, 4
                    sub-types are derived for huge object IDs for this heap:</p>

                <div align="center">
                    <table class="list">
                        <tr>
                            <th align="left" width="35%">Sub-type</th>
                            <th align="left">Description</th>
                        </tr>

                        <tr>
                            <td align="left">Directly accessed, non-filtered</td>
                            <td>
                                <p>The object&rsquo;s address and length are embedded in the
                                    fractal heap ID itself and the object is directly accessed from
                                    them. This allows the object to be accessed without resorting
                                    to the B-tree.</p>
                            </td>
                        </tr>

                        <tr>
                            <td align="left">Directly accessed, filtered</td>
                            <td>
                                <p>The filtered object&rsquo;s address, length, filter mask
                                    and de-filtered size are embedded in the fractal heap ID itself
                                    and the object is accessed directly with them. This allows the
                                    object to be accessed without resorting to the B-tree.</p>
                            </td>
                        </tr>

                        <tr>
                            <td align="left">Indirectly accessed, non-filtered</td>
                            <td>
                                <p>The object is located by using a B-tree key embedded in
                                    the fractal heap ID to retrieve the address and length from the
                                    version 2 B-tree for huge objects. Then, the address and length
                                    are used to access the object.</p>
                            </td>
                        </tr>

                        <tr>
                            <td align="left">Indirectly accessed, filtered</td>
                            <td>
                                <p>The object is located by using a B-tree key embedded in
                                    the fractal heap ID to retrieve the filtered object&rsquo;s
                                    address, length, filter mask and de-filtered size from the
                                    version 2 B-tree for huge objects. Then, this information is
                                    used to access the object.</p>
                            </td>
                        </tr>
                    </table>
                </div>

            </td>
        </tr>

        <tr>
            <td align="center">Managed</td>
            <td>
                <p>When the size of an object does not meet the above two
                    conditions, the object is stored and managed via the direct and
                    indirect blocks based on the doubling table.</p>
            </td>
        </tr>
    </table>
</div>


<p>The specific format for each type of heap ID is described below:
</p>

<div align="center">
    <table class="format">
        <caption>Fractal Heap ID for Tiny Objects (sub-type 1 -
            &lsquo;Normal&rsquo;)</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td>Version, Type & Length</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Data <em>(variable size)</em></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version, Type & Length</p></td>
            <td>
                <p>This is a bit field with the following definition:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>6-7</code></td>
                        <td>The current version of ID format. This document describes
                            version 0.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>4-5</code></td>
                        <td>The ID type. Tiny objects have a value of <code>2</code>.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>0-3</code></td>
                        <td>The length of the tiny object. The value stored is one
                            less than the actual length (since zero-length objects are not
                            allowed to be stored in the heap). For example, an object of
                            actual length 1 has an encoded length of 0, an object of actual
                            length 2 has an encoded length of 1, and so on.</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Data</p></td>
            <td>
                <p>This is the data for the object.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Fractal Heap ID for Tiny Objects (sub-type 2 -
            &lsquo;Extended&rsquo;)</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td>Version, Type & Length</td>
            <td>Extended Length</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Data <em>(variable size)</em></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version, Type & Length</p></td>
            <td>
                <p>This is a bit field with the following definition:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>6-7</code></td>
                        <td>The current version of ID format. This document describes
                            version 0.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>4-5</code></td>
                        <td>The ID type. Tiny objects have a value of <code>2</code>.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>0-3</code></td>
                        <td>These 4 bits, together with the next byte, form an
                            unsigned 12-bit integer for holding the length of the object.
                            These 4-bits are bits 8-11 of the 12-bit integer. See description
                            for the <em>Extended Length</em> field below.
                        </td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Extended Length</p></td>
            <td>
                <p>This byte, together with the 4 bits in the previous byte,
                    forms an unsigned 12-bit integer for holding the length of the tiny
                    object. These 8 bits are bits 0-7 of the 12-bit integer formed. The
                    value stored is one less than the actual length (since zero-length
                    objects are not allowed to be stored in the heap). For example, an
                    object of actual length 1 has an encoded length of 0, an object of
                    actual length 2 has an encoded length of 1, and so on.</p>
            </td>
        </tr>

        <tr>
            <td><p>Data</p></td>
            <td>
                <p>This is the data for the object.</p>
            </td>
        </tr>

    </table>
</div>


<br />
<br />
<div align="center">
    <table class="format">
        <caption>Fractal Heap ID for Huge Objects (sub-type 1 & 2):
            indirectly accessed, non-filtered/filtered</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td>Version & Type</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />v2 B-tree Key<sup>L</sup><em>
                    (variable size)</em><br />
            <br /></td>
        </tr>

    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;L&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Lengths&rdquo; field in the superblock.)</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version & Type</p></td>
            <td>
                <p>This is a bit field with the following definition:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>6-7</code></td>
                        <td>The current version of ID format. This document describes
                            version 0.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>4-5</code></td>
                        <td>The ID type. Huge objects have a value of <code>1</code>.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>0-3</code></td>
                        <td>Reserved.</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>v2 B-tree Key</p></td>
            <td><p>
                    This field is the B-tree key for retrieving the information from
                    the version 2 B-tree for huge objects needed to access the object.
                    See the description of <a href="#V2Btrees">v2 B-tree</a> records
                    sub-type 1 & 2 for a description of the fields. New key values are
                    derived from <em>Next Huge Object ID</em> in the <em>Fractal
                        Heap Header</em>.
                </p></td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Fractal Heap ID for Huge Objects (sub-type 3):
            directly accessed, non-filtered</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td>Version & Type</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address <sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Length <sup>L</sup><br />
            <br /></td>
        </tr>

    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version & Type</p></td>
            <td>
                <p>This is a bit field with the following definition:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>6-7</code></td>
                        <td>The current version of ID format. This document describes
                            version 0.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>4-5</code></td>
                        <td>The ID type. Huge objects have a value of <code>1</code>.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>0-3</code></td>
                        <td>Reserved.</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Address</p></td>
            <td><p>This field is the address of the object in the file.</p>
            </td>
        </tr>

        <tr>
            <td><p>Length</p></td>
            <td><p>This field is the length of the object in the file.</p></td>
        </tr>
    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Fractal Heap ID for Huge Objects (sub-type 4):
            directly accessed, filtered</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td>Version & Type</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address <sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Length <sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Filter Mask</td>
        </tr>

        <tr>
            <td colspan="4"><br />De-filtered Size <sup>L</sup><br />
            <br /></td>
        </tr>

    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version & Type</p></td>
            <td>
                <p>This is a bit field with the following definition:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>6-7</code></td>
                        <td>The current version of ID format. This document describes
                            version 0.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>4-5</code></td>
                        <td>The ID type. Huge objects have a value of <code>1</code>.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>0-3</code></td>
                        <td>Reserved.</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Address</p></td>
            <td><p>This field is the address of the filtered object in
                    the file.</p></td>
        </tr>

        <tr>
            <td><p>Length</p></td>
            <td><p>This field is the length of the filtered object in
                    the file.</p></td>
        </tr>

        <tr>
            <td><p>Filter Mask</p></td>
            <td><p>This field is the I/O pipeline filter mask for the
                    filtered object in the file.</p></td>
        </tr>

        <tr>
            <td><p>Filtered Size</p></td>
            <td><p>This field is the size of the de-filtered object in
                    the file.</p></td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Fractal Heap ID for Managed Objects</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td>Version & Type</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>
        <tr>
            <td colspan="4">Offset <em>(variable size)</em></td>
        </tr>

        <tr>
            <td colspan="4">Length <em>(variable size)</em></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version & Type</p></td>
            <td><p>This is a bit field with the following definition:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>6-7</code></td>
                        <td>The current version of ID format. This document describes
                            version 0.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>4-5</code></td>
                        <td>The ID type. Managed objects have a value of <code>0</code>.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>0-3</code></td>
                        <td>Reserved.</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Offset</p></td>
            <td><p>
                    This field is the offset of the object in the heap. This
                    field&rsquo;s size is the minimum number of bytes necessary to
                    encode the <em>Maximum Heap Size</em> value (from the <em>Fractal
                        Heap Header</em>). For example, if the value of the <em>Maximum
                        Heap Size</em> is less than 256 bytes, this field is 1 byte in length,
                    a <em>Maximum Heap Size</em> of 256-65535 bytes uses a 2 byte
                    length, and so on.
                </p></td>
        </tr>

        <tr>
            <td><p>Length</p></td>
            <td><p>
                    This field is the length of the object in the heap. It is
                    determined by taking the minimum value of <em>Maximum Direct
                        Block Size</em> and <em>Maximum Size of Managed Objects</em> in the <em>Fractal
                        Heap Header</em>. Again, the minimum number of bytes needed to encode
                    that value is used for the size of this field.
                </p></td>
        </tr>
    </table>
</div>

<br />
<h3>
    <a name="FreeSpaceManager"> III.G. Disk Format: Level 1G -
        Free-space Manager</a>
</h3>

<p>Free-space managers are used to describe space within a heap or
    the entire HDF5 file that is not currently used for that heap or file.
</p>

<p>
    The <em>free-space manager header</em> contains metadata information
    about the space being tracked, along with the address of the list of <em>free
        space sections</em> which actually describes the free space. The header
    records information about free-space sections being tracked, creation
    parameters for handling free-space sections of a client, and section
    information used to locate the collection of free-space sections.
</p>

<p>
    The <em>free-space section list</em> stores a collection of free-space
    sections that is specific to each <em>client</em> of the free-space
    manager. For example, the fractal heap is a client of the free space
    manager and uses it to track unused space within the heap. There are 4
    types of section records for the fractal heap, each of which has its
    own format, listed below.
</p>

<div align="center">
    <table class="format">
        <caption>Free-space Manager Header</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>

        <tr>
            <td>Version</td>
            <td>Client ID</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Total Space Tracked<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Total Number of Sections<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Number of Serialized Sections<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Number of Un-Serialized Sections<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="2">Number of Section Classes</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="2">Shrink Percent</td>
            <td colspan="2">Expand Percent</td>
        </tr>

        <tr>
            <td colspan="2">Size of Address Space</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Maximum Section Size <sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of Serialized Section List<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Size of Serialized Section List Used<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Allocated Size of Serialized Section List<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Checksum</td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="35%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>FSHD</code>
                    &rdquo; is used to indicate the beginning of the Free-space Manager
                    Header. This gives file consistency checking utilities a better
                    chance of reconstructing a damaged file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>This is the version number for the Free-space Manager Header
                    and this document describes version 0.</p>
            </td>
        </tr>

        <tr>
            <td><p>Client ID</p></td>
            <td>
                <p>This is the client ID for identifying the user of this
                    free-space manager:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">ID</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Fractal heap</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>File</td>
                    </tr>
                    <tr>
                        <td align="center"><code>2+</code></td>
                        <td>Reserved.</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Total Space Tracked</p></td>
            <td>
                <p>This is the total amount of free space being tracked, in
                    bytes.</p>
            </td>
        </tr>

        <tr>
            <td><p>Total Number of Sections</p></td>
            <td>
                <p>This is the total number of free-space sections being
                    tracked.</p>
            </td>
        </tr>

        <tr>
            <td><p>Number of Serialized Sections</p></td>
            <td>
                <p>This is the number of serialized free-space sections being
                    tracked.</p>
            </td>
        </tr>
        <tr>
            <td><p>Number of Un-Serialized Sections</p></td>
            <td>
                <p>This is the number of un-serialized free-space sections being
                    managed. Un-serialized sections are created by the free-space
                    client when the list of sections is read in.</p>
            </td>
        </tr>

        <tr>
            <td><p>Number of Section Classes</p></td>
            <td>
                <p>This is the number of section classes handled by this free
                    space manager for the free-space client.</p>
            </td>
        </tr>

        <tr>
            <td><p>Shrink Percent</p></td>
            <td>
                <p>This is the percent of current size to shrink the allocated
                    serialized free-space section list.</p>
            </td>
        </tr>

        <tr>
            <td><p>Expand Percent</p></td>
            <td>
                <p>This is the percent of current size to expand the allocated
                    serialized free-space section list.</p>
            </td>
        </tr>

        <tr>
            <td><p>Size of Address Space</p></td>
            <td>
                <p>
                    This is the size of the address space that free-space sections are
                    within. This is stored as the log<sub>2</sub> of the actual value
                    (in other words, the number of bits required to store values within
                    that address space).
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Maximum Section Size</p></td>
            <td>
                <p>This is the maximum size of a section to be tracked.</p>
            </td>
        </tr>

        <tr>
            <td><p>Address of Serialized Section List</p></td>
            <td>
                <p>This is the address where the serialized free-space section
                    list is stored.</p>
            </td>
        </tr>

        <tr>
            <td><p>Size of Serialized Section List Used</p></td>
            <td>
                <p>
                    This is the size of the serialized free-space section list used (in
                    bytes). This value must be less than or equal to the <em>allocated
                        size of serialized section list</em>, below.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Allocated Size of Serialized Section List</p></td>
            <td>
                <p>This is the size of serialized free-space section list
                    actually allocated (in bytes).</p>
            </td>
        </tr>

        <tr>
            <td><p>Checksum</p></td>
            <td>
                <p>This is the checksum for the free-space manager header.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<p>
    The free-space sections being managed are stored in a <em>free-space
        section list</em>, described below. The sections in the free-space section
    list are stored in the following way: a count of the number of sections
    describing a particular size of free space and the size of the
    free-space described (in bytes), followed by a list of section
    description records; then another section count and size, followed by
    the list of section descriptions for that size; and so on.
</p>


<div align="center">
    <table class="format">
        <caption>Free-space Section List</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>

        <tr>
            <td>Version</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Free-space Manager Header Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Number of Section Records in Set #0 <em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="4">Size of Free-space Section Described in Record
                Set #0 <em>(variable size)</em>
            </td>
        </tr>

        <tr>
            <td colspan="4">Record Set #0 Section Record #0 Offset<em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="1">Record Set #0 Section Record #0 Type</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Record Set #0 Section Record #0 Data <em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="4">...</td>
        </tr>

        <tr>
            <td colspan="4">Record Set #0 Section Record #K-1 Offset<em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="1">Record Set #0 Section Record #K-1 Type</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Record Set #0 Section Record #K-1 Data <em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="4">Number of Section Records in Set #1 <em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="4">Size of Free-space Section Described in Record
                Set #1 <em>(variable size)</em>
            </td>
        </tr>

        <tr>
            <td colspan="4">Record Set #1 Section Record #0 Offset<em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="1">Record Set #1 Section Record #0 Type</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Record Set #1 Section Record #0 Data <em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="4">...</td>
        </tr>

        <tr>
            <td colspan="4">Record Set #1 Section Record #K-1 Offset<em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="1">Record Set #1 Section Record #K-1 Type</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Record Set #1 Section Record #K-1 Data <em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="4"><strong>...</strong></td>
        </tr>

        <tr>
            <td colspan="4"><strong>...</strong></td>
        </tr>

        <tr>
            <td colspan="4">Number of Section Records in Set #N-1 <em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="4">Size of Free-space Section Described in Record
                Set #N-1 <em>(variable size)</em>
            </td>
        </tr>

        <tr>
            <td colspan="4">Record Set #N-1 Section Record #0 Offset<em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="1">Record Set #N-1 Section Record #0 Type</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Record Set #N-1 Section Record #0 Data <em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="4">...</td>
        </tr>

        <tr>
            <td colspan="4">Record Set #N-1 Section Record #K-1 Offset<em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="1">Record Set #N-1 Section Record #K-1 Type</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Record Set #N-1 Section Record #K-1 Data <em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="4">Checksum</td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="35%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>FSSE</code>
                    &rdquo; is used to indicate the beginning of the Free-space Section
                    Information. This gives file consistency checking utilities a
                    better chance of reconstructing a damaged file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>This is the version number for the Free-space Section List
                    and this document describes version 0.</p>
            </td>
        </tr>

        <tr>
            <td><p>Free-space Manager Header Address</p></td>
            <td>
                <p>
                    This is the address of the <em>Free-space Manager Header</em>. This
                    field is principally used for file integrity checking.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Number of Section Records for Set #N</p></td>
            <td>
                <p>
                    This is the number of free-space section records for set #N. The
                    length of this field is the minimum number of bytes needed to store
                    the <em>number of serialized sections</em> (from the <em>free-space
                        manager header</em>).
                </p>

                <p>
                    The number of sets of free-space section records is determined by
                    the <em>size of serialized section list</em> in the <em>free-space
                        manager header</em>.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Section Size for Record Set #N</p></td>
            <td>
                <p>
                    This is the size (in bytes) of the free-space section described for
                    <em>all</em> the section records in set #N.
                </p>

                <p>
                    The length of this field is the minimum number of bytes needed to
                    store the <em>maximum section size</em> (from the <em>free-space
                        manager header</em>).
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Record Set #N Section #K Offset</p></td>
            <td>
                <p>This is the offset (in bytes) of the free-space section
                    within the client for the free-space manager.</p>

                <p>
                    The length of this field is the minimum number of bytes needed to
                    store the <em>size of address space</em> (from the <em>free-space
                        manager header</em>).
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Record Set #N Section #K Type</p></td>
            <td>
                <p>
                    This is the type of the section record, used to decode the <em>record
                        set #N section #K data</em> information. The defined record type for <em>file</em>
                    client is:

                </p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Type</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>File&rsquo;s section (a range of actual bytes in file)</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1+</code></td>
                        <td>Reserved.</td>
                    </tr>
                </table>
                <p></p>

                <p>
                    The defined record types for a <em>fractal heap</em> client are:

                </p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Type</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Fractal heap &ldquo;single&rdquo; section</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Fractal heap &ldquo;first row&rdquo; section</td>
                    </tr>

                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Fractal heap &ldquo;normal row&rdquo; section</td>
                    </tr>

                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>Fractal heap &ldquo;indirect&rdquo; section</td>
                    </tr>

                    <tr>
                        <td align="center"><code>4+</code></td>
                        <td>Reserved.</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Record Set #N Section #K Data</p></td>
            <td>
                <p>This is the section-type specific information for each record
                    in the record set, described below.</p>
            </td>
        </tr>

        <tr>
            <td><p>Checksum</p></td>
            <td>
                <p>
                    This is the checksum for the <em>Free-space Section List</em>.
                </p>
            </td>
        </tr>

    </table>
</div>

<br />
<p>The section-type specific data for each free-space section record
    is described below:</p>

<div align="center">
    <table class="format">
        <caption>File&rsquo;s Section Data Record</caption>

        <tr>
            <td colspan="4"><em>No additional record data stored</em></td>
        </tr>
    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Fractal Heap &ldquo;Single&rdquo; Section Data
            Record</caption>

        <tr>
            <td colspan="4"><em>No additional record data stored</em></td>
        </tr>
    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Fractal Heap &ldquo;First Row&rdquo; Section Data
            Record</caption>

        <tr>
            <td colspan="4"><em>Same format as &ldquo;indirect&rdquo;
                    section data</em></td>
        </tr>
    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Fractal Heap &ldquo;Normal Row&rdquo; Section Data
            Record</caption>

        <tr>
            <td colspan="4"><em>No additional record data stored</em></td>
        </tr>
    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Fractal Heap &ldquo;Indirect&rdquo; Section Data
            Record</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Fractal Heap Indirect Block Offset <em>(variable
                    size)</em></td>
        </tr>

        <tr>
            <td colspan="2">Block Start Row</td>
            <td colspan="2">Block Start Column</td>
        </tr>

        <tr>
            <td colspan="2">Number of Blocks</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Fractal Heap Block Offset</p></td>
            <td>
                <p>The offset of the indirect block in the fractal heap&rsquo;s
                    address space containing the empty blocks.</p>
                <p>
                    The number of bytes used to encode this field is the minimum number
                    of bytes needed to encode values for the <em>Maximum Heap Size</em>
                    (in the fractal heap&rsquo;s header).
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Block Start Row</p></td>
            <td>
                <p>This is the row that the empty blocks start in.</p>
            </td>
        </tr>

        <tr>
            <td><p>Block Start Column</p></td>
            <td>
                <p>This is the column that the empty blocks start in.</p>
            </td>
        </tr>

        <tr>
            <td><p>Number of Blocks</p></td>
            <td>
                <p>This is the number of empty blocks covered by the section.</p>
            </td>
        </tr>
    </table>
</div>

<br />
<h3>
    <a name="SOHMTable"> III.H. Disk Format: Level 1H - Shared Object
        Header Message Table</a>
</h3>

<p>
    The <em>shared object header message table</em> is used to locate
    object header messages that are shared between two or more object
    headers in the file. Shared object header messages are stored and
    indexed in the file in one of two ways: indexed sequentially in a <em>shared
        header message list</em> or indexed with a v2 B-tree. The shared messages
    themselves are either stored in a fractal heap (when two or more
    objects share the message), or remain in an object&rsquo;s header (when
    only one object uses the message currently, but the message can be
    shared in the future).
</p>

<p>
    The <em>shared object header message table</em> contains a list of
    shared message index headers. Each index header records information
    about the version of the index format, the index storage type, flags
    for the message types indexed, the number of messages in the index, the
    address where the index resides, and the fractal heap address if shared
    messages are stored there.
</p>

<p>
    Each index can be either a list or a v2 B-tree and may transition
    between those two forms as the number of messages in the index varies.
    Each shared message record contains information used to locate the
    shared message from either a fractal heap or an object header. The
    types of messages that can be shared are: <em>Dataspace, Datatype,
        Fill Value, Filter Pipeline and Attribute</em>.
</p>

<p>
    The <em>shared object header message table</em> is pointed to from a <a
        href="#SOHMTableMessage">shared message table</a> message in the
    superblock extension for a file. This message stores the version of the
    table format, along with the number of index headers in the table.
</p>

<div align="center">
    <table class="format">
        <caption>Shared Object Header Message Table</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>

        <tr>
            <td>Version for index #0</td>
            <td>Index Type for index #0</td>
            <td colspan="2">Message Type Flags for index #0</td>
        </tr>

        <tr>
            <td colspan="4">Minimum Message Size for index #0</td>
        </tr>

        <tr>
            <td colspan="2">List Cutoff for index #0</td>
            <td colspan="2">v2 B-tree Cutoff for index #0</td>
        </tr>

        <tr>
            <td colspan="2">Number of Messages for index #0</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Index Address<sup>O</sup> for index #0<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Fractal Heap Address<sup>O</sup> for
                index #0<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">...</td>
        </tr>

        <tr>
            <td colspan="4">...</td>
        </tr>

        <tr>
            <td>Version for index #N-1</td>
            <td>Index Type for index #N-1</td>
            <td colspan="2">Message Type Flags for index #N-1</td>
        </tr>

        <tr>
            <td colspan="4">Minimum Message Size for index #N-1</td>
        </tr>

        <tr>
            <td colspan="2">List Cutoff for index #N-1</td>
            <td colspan="2">v2 B-tree Cutoff for index #N-1</td>
        </tr>

        <tr>
            <td colspan="2">Number of Messages for index #N-1</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Index Address<sup>O</sup> for index #N-1<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Fractal Heap Address<sup>O</sup> for
                index #N-1<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Checksum</td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="35%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>SMTB</code>
                    &rdquo; is used to indicate the beginning of the Shared Object
                    Header Message table. This gives file consistency checking
                    utilities a better chance of reconstructing a damaged file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version for index #N</p></td>
            <td>
                <p>This is the version number for the list of shared object
                    header message indexes and this document describes version 0.</p>
            </td>
        </tr>

        <tr>
            <td><p>Index Type for index #N</p></td>
            <td>
                <p>The type of index can be an unsorted list or a v2 B-tree.</p>
            </td>
        </tr>

        <tr>
            <td><p>Message Type Flags for index #N</p></td>
            <td>
                <p>This field indicates the type of messages tracked in the
                    index, as follows:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bits</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>If set, the index tracks <em>Dataspace Messages</em>.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>If set, the message tracks <em>Datatype Messages</em>.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>If set, the message tracks <em>Fill Value Messages</em>.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>If set, the message tracks <em>Filter Pipeline
                                Messages</em>.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>4</code></td>
                        <td>If set, the message tracks <em>Attribute Messages</em>.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>5-15</code></td>
                        <td>Reserved (zero).</td>
                    </tr>
                </table>
                <p></p>


                <p>An index can track more than one type of message, but each
                    type of message can only by in one index.</p>
            </td>
        </tr>

        <tr>
            <td><p>Minimum Message Size for index #N</p></td>
            <td>
                <p>This is the message size sharing threshold for the index. If
                    the encoded size of the message is less than this value, the
                    message is not shared.</p>
            </td>
        </tr>

        <tr>
            <td><p>List Cutoff for index #N</p></td>
            <td>
                <p>This is the cutoff value for the indexing of messages to
                    switch from a list to a v2 B-tree. If the number of messages is
                    greater than this value, the index should be a v2 B-tree.</p>
            </td>
        </tr>
        <tr>
            <td><p>v2 B-tree Cutoff for index #N</p></td>
            <td>
                <p>This is the cutoff value for the indexing of messages to
                    switch from a v2 B-tree back to a list. If the number of messages
                    is less than this value, the index should be a list.</p>
            </td>
        </tr>

        <tr>
            <td><p>Number of Messages for index #N</p></td>
            <td>
                <p>The number of shared messages being tracked for the index.</p>
            </td>
        </tr>

        <tr>
            <td><p>Index Address for index #N</p></td>
            <td>
                <p>This field is the address of the list or v2 B-tree where the
                    index nodes reside.</p>
            </td>
        </tr>

        <tr>
            <td><p>Fractal Heap Address for index #N</p></td>
            <td>
                <p>This field is the address of the fractal heap if shared
                    messages are stored there.</p>
            </td>
        </tr>

        <tr>
            <td><p>Checksum</p></td>
            <td>
                <p>This is the checksum for the table.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<p>
    Shared messages are indexed either with a <em>shared message
        record list</em>, described below, or using a v2 B-tree (using record type
    7). The number of records in the <em>shared message record list</em> is
    determined in the index&rsquo;s entry in the <em>shared object
        header message table</em>.
</p>

<div align="center">
    <table class="format">
        <caption>Shared Message Record List</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>

        <tr>
            <td colspan="4">Shared Message Record #0</td>
        </tr>

        <tr>
            <td colspan="4">Shared Message Record #1</td>
        </tr>

        <tr>
            <td colspan="4">...</td>
        </tr>

        <tr>
            <td colspan="4">Shared Message Record #N-1</td>
        </tr>

        <tr>
            <td colspan="4">Checksum</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>SMLI</code>
                    &rdquo; is used to indicate the beginning of a list of index nodes.
                    This gives file consistency checking utilities a better chance of
                    reconstructing a damaged file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Shared Message Record #N</p></td>
            <td>
                <p>
                    The record for locating the shared message, either in the fractal
                    heap for the index, or an object header (see format for <em>index
                        nodes</em> below).
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Checksum</p></td>
            <td>
                <p>This is the checksum for the list.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<p>The record for each shared message in an index is stored in one
    of the following forms:</p>

<div align="center">
    <table class="format">
        <caption>Shared Message Record, for messages stored in a
            fractal heap</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td>Message Location</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Hash Value</td>
        </tr>

        <tr>
            <td colspan="4">Reference Count</td>
        </tr>

        <tr>
            <td colspan="4"><br />Fractal Heap ID<br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Message Location</p></td>
            <td>
                <p>This has a value of 0 indicating that the message is stored
                    in the heap.</p>
            </td>
        </tr>

        <tr>
            <td><p>Hash Value</p></td>
            <td>
                <p>This is the hash value for the message.</p>
            </td>
        </tr>

        <tr>
            <td><p>Reference Count</p></td>
            <td>
                <p>This is the number of times the message is used in the file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Fractal Heap ID</p></td>
            <td>
                <p>This is an 8-byte fractal heap ID for the message as stored
                    in the fractal heap for the index.</p>
            </td>
        </tr>
    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Shared Message Record, for messages stored in an
            object header</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td>Message Location</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Hash Value</td>
        </tr>

        <tr>
            <td>Reserved</td>
            <td>Message Type</td>
            <td colspan="2">Creation Index</td>
        </tr>

        <tr>
            <td colspan="4"><br />Object Header Address<sup>O</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Message Location</p></td>
            <td>
                <p>This has a value of 1 indicating that the message is stored
                    in an object header.</p>
            </td>
        </tr>

        <tr>
            <td><p>Hash Value</p></td>
            <td>
                <p>This is the hash value for the message.</p>
            </td>
        </tr>

        <tr>
            <td><p>Message Type</p></td>
            <td>
                <p>This is the message type in the object header.</p>
            </td>
        </tr>

        <tr>
            <td><p>Creation Index</p></td>
            <td>
                <p>This is the creation index of the message within the object
                    header.</p>
            </td>
        </tr>

        <tr>
            <td><p>Object Header Address</p></td>
            <td>
                <p>This is the address of the object header where the message is
                    located.</p>
            </td>
        </tr>
    </table>
</div>



<br />
<br />
<hr />
<h2>
    <a name="DataObject"> IV. Disk Format: Level 2 - Data Objects </a>
</h2>

<p>Data objects contain the &ldquo;real&rdquo; user-visible
    information in the file. These objects compose the scientific data and
    other information which are generally thought of as &ldquo;data&rdquo;
    by the end-user. All the other information in the file is provided as a
    framework for storing and accessing these data objects.</p>

<p>A data object is composed of header and data information. The
    header information contains the information needed to interpret the
    data information for the object as well as additional
    &ldquo;metadata&rdquo; or pointers to additional &ldquo;metadata&rdquo;
    used to describe or annotate each object.</p>

<br />
<h3>
    <a name="ObjectHeader"> IV.A. Disk Format: Level 2A - Data Object
        Headers</a>
</h3>

<p>The header information of an object is designed to encompass all
    of the information about an object, except for the data itself. This
    information includes the dataspace, the datatype, information about how
    the data is stored on disk (in external files, compressed, broken up in
    blocks, and so on), as well as other information used by the library to
    speed up access to the data objects or maintain a file&rsquo;s
    integrity. Information stored by user applications as attributes is
    also stored in the object&rsquo;s header. The header of each object is
    not necessarily located immediately prior to the object&rsquo;s data in
    the file and in fact may be located in any position in the file. The
    order of the messages in an object header is not significant.</p>

<p>Object headers are composed of a prefix and a set of messages.
    The prefix contains the information needed to interpret the messages
    and a small amount of metadata about the object, and the messages
    contain the majority of the metadata about the object.</p>

<br />
<h3>
    <a name="ObjectHeaderPrefix"> IV.A.1. Disk Format: Level 2A1 - Data
        Object Header Prefix</a>
</h3>

<br />
<h4>
    <a name="V1ObjectHeaderPrefix"> IV.A.1.a. Version 1 Data Object
        Header Prefix</a>
</h4>

<p>Header messages are aligned on 8-byte boundaries for version 1
    object headers.</p>

<div align="center">
    <table class="format">
        <caption>Version 1 Object Header</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Reserved (zero)</td>
            <td colspan="2">Total Number of Header Messages</td>
        </tr>

        <tr>
            <td colspan="4">Object Reference Count</td>
        </tr>

        <tr>
            <td colspan="4">Object Header Size</td>
        </tr>

        <tr>
            <td colspan="2">Header Message Type #1</td>
            <td colspan="2">Size of Header Message Data #1</td>
        </tr>

        <tr>
            <td>Header Message #1 Flags</td>
            <td colspan="3">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4"><br />Header Message Data #1<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">.<br />.<br />.<br /></td>
        </tr>

        <tr>
            <td colspan="2">Header Message Type #n</td>
            <td colspan="2">Size of Header Message Data #n</td>
        </tr>

        <tr>
            <td>Header Message #n Flags</td>
            <td colspan="3">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4"><br />Header Message Data #n<br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>This value is used to determine the format of the information
                    in the object header. When the format of the object header is
                    changed, the version number is incremented and can be used to
                    determine how the information in the object header is formatted.
                    This is version one (1) (there was no version zero (0)) of the
                    object header.</p>
            </td>
        </tr>

        <tr>
            <td><p>Total Number of Header Messages</p></td>
            <td>
                <p>This value determines the total number of messages listed in
                    object headers for this object. This value includes the messages in
                    continuation messages for this object.</p>
            </td>
        </tr>

        <tr>
            <td><p>Object Reference Count</p></td>
            <td>
                <p>This value specifies the number of &ldquo;hard links&rdquo;
                    to this object within the current file. References to the object
                    from external files, &ldquo;soft links&rdquo; in this file and
                    object references in this file are not tracked.</p>
            </td>
        </tr>

        <tr>
            <td><p>Object Header Size</p></td>
            <td>
                <p>This value specifies the number of bytes of header message
                    data following this length field that contain object header
                    messages for this object header. This value does not include the
                    size of object header continuation blocks for this object elsewhere
                    in the file.</p>
            </td>
        </tr>

        <tr>
            <td><p>Header Message #n Type</p></td>
            <td>
                <p>This value specifies the type of information included in the
                    following header message data. The message types for header
                    messages are defined in sections below.</p>
            </td>
        </tr>

        <tr>
            <td><p>Size of Header Message #n Data</p></td>
            <td>
                <p>This value specifies the number of bytes of header message
                    data following the header message type and length information for
                    the current message. The size includes padding bytes to make the
                    message a multiple of eight bytes.</p>
            </td>
        </tr>

        <tr>
            <td><p>Header Message #n Flags</p></td>
            <td>
                <p>This is a bit field with the following definition:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>If set, the message data is constant. This is used for
                            messages like the datatype message of a dataset.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>If set, the message is <em>shared</em> and stored in
                            another location than the object header. The Header Message Data
                            field contains a Shared Message (described in the <a
                            href="#ObjectHeaderMessages">Data Object Header Messages</a>
                            section below) and the Size of Header Message Data field contains
                            the size of that Shared Message.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>If set, the message should not be shared.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>If set, the HDF5 decoder should fail to open this object
                            if it does not understand the message&rsquo;s type and the file
                            is open with permissions allowing write access to the file.
                            (Normally, unknown messages can just be ignored by HDF5 decoders)
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>4</code></td>
                        <td>If set, the HDF5 decoder should set bit 5 of this
                            message&rsquo;s flags (in other words, this bit field) if it does
                            not understand the message&rsquo;s type and the object is
                            modified in any way. (Normally, unknown messages can just be
                            ignored by HDF5 decoders)</td>
                    </tr>
                    <tr>
                        <td align="center"><code>5</code></td>
                        <td>If set, this object was modified by software that did not
                            understand this message. (Normally, unknown messages should just
                            be ignored by HDF5 decoders) (Can be used to invalidate an index
                            or a similar feature)</td>
                    </tr>
                    <tr>
                        <td align="center"><code>6</code></td>
                        <td>If set, this message is shareable.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>7</code></td>
                        <td>If set, the HDF5 decoder should always fail to open this
                            object if it does not understand the message&rsquo;s type
                            (whether it is open for read-only or read-write access).
                            (Normally, unknown messages can just be ignored by HDF5 decoders)
                        </td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Header Message #n Data</p></td>
            <td>
                <p>The format and length of this field is determined by the
                    header message type and size respectively. Some header message
                    types do not require any data and this information can be
                    eliminated by setting the length of the message to zero. The data
                    is padded with enough zeroes to make the size a multiple of eight.
                </p>
            </td>
        </tr>
    </table>
</div>

<br />
<h4>
    <a name="V2ObjectHeaderPrefix"> IV.A.1.b. Version 2 Data Object
        Header Prefix</a>
</h4>

<p>Note that the &ldquo;total number of messages&rdquo; field has
    been dropped from the data object header prefix in this version. The
    number of messages in the data object header is just determined by the
    messages encountered in all the object header blocks.</p>

<p>
    Note also that the fields and messages in this version of data object
    headers have <em>no</em> alignment or padding bytes inserted - they are
    stored packed together.
</p>

<div align="center">
    <table class="format">
        <caption>Version 2 Object Header</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>
        <tr>
            <td>Version</td>
            <td>Flags</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Access time <em>(optional)</em></td>
        </tr>

        <tr>
            <td colspan="4">Modification Time <em>(optional)</em></td>
        </tr>

        <tr>
            <td colspan="4">Change Time <em>(optional)</em></td>
        </tr>

        <tr>
            <td colspan="4">Birth Time <em>(optional)</em></td>
        </tr>

        <tr>
            <td colspan="2">Maximum # of compact attributes <em>(optional)</em></td>
            <td colspan="2">Minimum # of dense attributes <em>(optional)</em></td>
        </tr>

        <tr>
            <td>Size of Chunk #0 <em>(variable size)</em></td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td>Header Message Type #1</td>
            <td colspan="2">Size of Header Message Data #1</td>
            <td>Header Message #1 Flags</td>
        </tr>

        <tr>
            <td colspan="2">Header Message #1 Creation Order <em>(optional)</em></td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Header Message Data #1<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">.<br />.<br />.<br /></td>
        </tr>

        <tr>
            <td>Header Message Type #n</td>
            <td colspan="2">Size of Header Message Data #n</td>
            <td>Header Message #n Flags</td>
        </tr>

        <tr>
            <td colspan="2">Header Message #n Creation Order <em>(optional)</em></td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Header Message Data #n<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Gap <em>(optional, variable size)</em></td>
        </tr>

        <tr>
            <td colspan="4">Checksum</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>OHDR</code>
                    &rdquo; is used to indicate the beginning of an object header. This
                    gives file consistency checking utilities a better chance of
                    reconstructing a damaged file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>This field has a value of 2 indicating version 2 of the
                    object header.</p>
            </td>
        </tr>

        <tr>
            <td><p>Flags</p></td>
            <td>
                <p>This field is a bit field indicating additional information
                    about the object header.</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit(s)</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0-1</code></td>
                        <td>This two bit field determines the size of the <em>Size
                                of Chunk #0</em> field. The values are:
                            <table class="list">
                                <tr>
                                    <th width="20%" align="center">Value</th>
                                    <th width="80%" align="left">Description</th>
                                </tr>

                                <tr>
                                    <td align="center"><code>0</code></td>
                                    <td>The <em>Size of Chunk #0</em> field is 1 byte.
                                    </td>
                                </tr>
                                <tr>
                                    <td align="center"><code>1</code></td>
                                    <td>The <em>Size of Chunk #0</em> field is 2 bytes.
                                    </td>
                                </tr>
                                <tr>
                                    <td align="center"><code>2</code></td>
                                    <td>The <em>Size of Chunk #0</em> field is 4 bytes.
                                    </td>
                                </tr>
                                <tr>
                                    <td align="center"><code>3</code></td>
                                    <td>The <em>Size of Chunk #0</em> field is 8 bytes.
                                    </td>
                                </tr>
                            </table>
                            <p></p>
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>If set, attribute creation order is tracked.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>If set, attribute creation order is indexed.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>4</code></td>
                        <td>If set, non-default attribute storage phase change values
                            are stored.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>5</code></td>
                        <td>If set, access, modification, change and birth times are
                            stored.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>6-7</code></td>
                        <td>Reserved</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Access Time</p></td>
            <td>
                <p>This 32-bit value represents the number of seconds after the
                    UNIX epoch when the object&rsquo;s raw data was last accessed (in
                    other words, read or written).</p>
                <p>
                    This field is present if bit 5 of <em>flags</em> is set.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Modification Time</p></td>
            <td>
                <p>This 32-bit value represents the number of seconds after the
                    UNIX epoch when the object&rsquo;s raw data was last modified (in
                    other words, written).</p>
                <p>
                    This field is present if bit 5 of <em>flags</em> is set.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Change Time</p></td>
            <td>
                <p>This 32-bit value represents the number of seconds after the
                    UNIX epoch when the object&rsquo;s metadata was last changed.</p>
                <p>
                    This field is present if bit 5 of <em>flags</em> is set.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Birth Time</p></td>
            <td>
                <p>This 32-bit value represents the number of seconds after the
                    UNIX epoch when the object was created.</p>
                <p>
                    This field is present if bit 5 of <em>flags</em> is set.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Maximum # of compact attributes</p></td>
            <td>
                <p>This is the maximum number of attributes to store in the
                    compact format before switching to the indexed format.</p>
                <p>
                    This field is present if bit 4 of <em>flags</em> is set.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Minimum # of dense attributes</p></td>
            <td>
                <p>This is the minimum number of attributes to store in the
                    indexed format before switching to the compact format.</p>
                <p>
                    This field is present if bit 4 of <em>flags</em> is set.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Size of Chunk #0</p></td>
            <td>
                <p>This unsigned value specifies the number of bytes of header
                    message data following this field that contain object header
                    information.</p>
                <p>This value does not include the size of object header
                    continuation blocks for this object elsewhere in the file.</p>
                <p>
                    The length of this field varies depending on bits 0 and 1 of the <em>flags</em>
                    field.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Header Message #n Type</p></td>
            <td>
                <p>Same format as version 1 of the object header, described
                    above.</p>
            </td>
        </tr>

        <tr>
            <td><p>Size of Header Message #n Data</p></td>
            <td>
                <p>
                    This value specifies the number of bytes of header message data
                    following the header message type and length information for the
                    current message. The size of messages in this version does <em>not</em>
                    include any padding bytes.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Header Message #n Flags</p></td>
            <td>
                <p>Same format as version 1 of the object header, described
                    above.</p>
            </td>
        </tr>

        <tr>
            <td><p>Header Message #n Creation Order</p></td>
            <td>
                <p>This field stores the order that a message of a given type
                    was created in.</p>
                <p>
                    This field is present if bit 2 of <em>flags</em> is set.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Header Message #n Data</p></td>
            <td>
                <p>Same format as version 1 of the object header, described
                    above.</p>
            </td>
        </tr>

        <tr>
            <td><p>Gap</p></td>
            <td>
                <p>A gap in an object header chunk is inferred by the end of the
                    messages for the chunk before the beginning of the chunk&rsquo;s
                    checksum. Gaps are always smaller than the size of an object header
                    message prefix (message type + message size + message flags).</p>
                <p>Gaps are formed when a message (typically an attribute
                    message) in an earlier chunk is deleted and a message from a later
                    chunk that does not quite fit into the free space is moved into the
                    earlier chunk.</p>
            </td>
        </tr>

        <tr>
            <td><p>Checksum</p></td>
            <td>
                <p>This is the checksum for the object header chunk.</p>
            </td>
        </tr>
    </table>
</div>

<p>The header message types and the message data associated with
    them compose the critical &ldquo;metadata&rdquo; about each object.
    Some header messages are required for each object while others are
    optional. Some optional header messages may also be repeated several
    times in the header itself, the requirements and number of times
    allowed in the header will be noted in each header message description
    below.</p>


<br />
<h3>
    <a name="ObjectHeaderMessages"> IV.A.2. Disk Format: Level 2A2 -
        Data Object Header Messages</a>
</h3>

<p>Data object header messages are small pieces of metadata that are
    stored in the data object header for each object in an HDF5 file. Data
    object header messages provide the metadata required to describe an
    object and its contents, as well as optional pieces of metadata that
    annotate the meaning or purpose of the object.</p>

<p>
    Data object header messages are either stored directly in the data
    object header for the object or are shared between multiple objects in
    the file. When a message is shared, a flag in the <em>Message
        Flags</em> indicates that the actual <em>Message Data</em> portion of that
    message is stored in another location (such as another data object
    header, or a heap in the file) and the <em>Message Data</em> field
    contains the information needed to locate the actual information for
    the message.
</p>

<p>The format of shared message data is described here:</p>

<div align="center">
    <table class="format">
        <caption>Shared Message (Version 1)</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Type</td>
            <td colspan="2">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4"><br />Address<sup>O</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number is used when there are changes in
                    the format of a shared object message and is described here:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Version</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Never used.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Used by the library before version 1.6.1.</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Type</p></td>
            <td><p>The type of shared message location:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Message stored in another object&rsquo;s header (a <em>committed</em>
                            message).
                        </td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Address</p></td>
            <td><p>The address of the object header containing the
                    message to be shared.</p></td>
        </tr>
    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Shared Message (Version 2)</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Type</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address<sup>O</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number is used when there are changes in
                    the format of a shared object message and is described here:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Version</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Used by the library of version 1.6.1 and after.</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Type</p></td>
            <td><p>The type of shared message location:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Message stored in another object&rsquo;s header (a <em>committed</em>
                            message).
                        </td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Address</p></td>
            <td><p>The address of the object header containing the
                    message to be shared.</p></td>
        </tr>
    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Shared Message (Version 3)</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Type</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Location <em>(variable size)</em></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number indicates changes in the format of
                    shared object message and is described here:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Version</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>Used by the library of version 1.8 and after. In this
                            version, the <em>Type</em> field can indicate that the message is
                            stored in the fractal heap.
                        </td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Type</p></td>
            <td><p>The type of shared message location:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Message is not shared and is not shareable.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Message stored in file&rsquo;s <em>shared object
                                header message</em> heap (a <em>shared</em> message).
                        </td>
                    </tr>

                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Message stored in another object&rsquo;s header (a <em>committed</em>
                            message).
                        </td>
                    </tr>

                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>Message stored is not shared, but is shareable.</td>
                    </tr>

                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Location</p></td>
            <td><p>
                    This field contains either a <em>Size of Offsets</em>-bytes address
                    of the object header containing the message to be shared, or an
                    8-byte fractal heap ID for the message in the file&rsquo;s <em>shared
                        object header message</em> heap.
                </p></td>
        </tr>
    </table>
</div>


<p>The following is a list of currently defined header messages:</p>

<br />
<h4>
    <a name="NILMessage">IV.A.2.a. The NIL Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> NIL</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0000</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>The NIL message is used to indicate a message which is to be
                ignored when reading the header messages for a data object.
                [Possibly one which has been deleted for some reason.]</td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> Unspecified</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->


<br />
<h4>
    <a name="DataspaceMessage">IV.A.2.b. The Dataspace Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Dataspace</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0001</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies according to the number of
                dimensions, as described in the following table.</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Required for dataset objects; may
                not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>The dataspace message describes the number of dimensions (in
                other words, &ldquo;rank&rdquo;) and size of each dimension that the
                data object has. This message is only used for datasets which have a
                simple, rectilinear, array-like layout; datasets requiring a more
                complex layout are not yet supported.</td>
        </tr>

        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Dataspace Message - Version 1</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Dimensionality</td>
            <td>Flags</td>
            <td>Reserved</td>
        </tr>

        <tr>
            <td colspan="4">Reserved</td>
        </tr>

        <tr>
            <td colspan="4"><br />Dimension #1 Size<sup>L</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4">.<br />.<br />.<br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Dimension #n Size<sup>L</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Dimension #1 Maximum Size<sup>L</sup> <em>(optional)</em><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4">.<br />.<br />.<br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Dimension #n Maximum Size<sup>L</sup> <em>(optional)</em><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Permutation Index #1<sup>L</sup> <em>(optional)</em><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4">.<br />.<br />.<br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Permutation Index #n<sup>L</sup> <em>(optional)</em><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;L&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Lengths&rdquo; field in the superblock.)</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>This value is used to determine the format of the Dataspace
                    Message. When the format of the information in the message is
                    changed, the version number is incremented and can be used to
                    determine how the information in the object header is formatted.
                    This document describes version one (1) (there was no version zero
                    (0)).</p>
            </td>
        </tr>

        <tr>
            <td><p>Dimensionality</p></td>
            <td>
                <p>This value is the number of dimensions that the data object
                    has.</p>
            </td>
        </tr>

        <tr>
            <td><p>Flags</p></td>
            <td>
                <p>This field is used to store flags to indicate the presence of
                    parts of this message. Bit 0 (the least significant bit) is used to
                    indicate that maximum dimensions are present. Bit 1 is used to
                    indicate that permutation indices are present.</p>
            </td>
        </tr>

        <tr>
            <td><p>Dimension #n Size</p></td>
            <td>
                <p>This value is the current size of the dimension of the data
                    as stored in the file. The first dimension stored in the list of
                    dimensions is the slowest changing dimension and the last dimension
                    stored is the fastest changing dimension.</p>
            </td>
        </tr>

        <tr>
            <td><p>Dimension #n Maximum Size</p></td>
            <td>
                <p>
                    This value is the maximum size of the dimension of the data as
                    stored in the file. This value may be the special &ldquo;<a
                        href="#UnlimitedDim">unlimited</a>&rdquo; size which indicates
                    that the data may expand along this dimension indefinitely. If
                    these values are not stored, the maximum size of each dimension is
                    assumed to be the dimension&rsquo;s current size.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Permutation Index #n</p></td>
            <td>
                <p>This value is the index permutation used to map each
                    dimension from the canonical representation to an alternate axis
                    for each dimension. If these values are not stored, the first
                    dimension stored in the list of dimensions is the slowest changing
                    dimension and the last dimension stored is the fastest changing
                    dimension.</p>
            </td>
        </tr>
    </table>
</div>



<br />
<p>Version 2 of the dataspace message dropped the optional
    permutation index value support, as it was never implemented in the
    HDF5 Library:</p>

<div align="center">
    <table class="format">
        <caption>Dataspace Message - Version 2</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Dimensionality</td>
            <td>Flags</td>
            <td>Type</td>
        </tr>

        <tr>
            <td colspan="4"><br />Dimension #1 Size<sup>L</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4">.<br />.<br />.<br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Dimension #n Size<sup>L</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Dimension #1 Maximum Size<sup>L</sup> <em>(optional)</em><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4">.<br />.<br />.<br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Dimension #n Maximum Size<sup>L</sup> <em>(optional)</em><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;L&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Lengths&rdquo; field in the superblock.)</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>This value is used to determine the format of the Dataspace
                    Message. This field should be &lsquo;2&rsquo; for version 2 format
                    messages.</p>
            </td>
        </tr>

        <tr>
            <td><p>Dimensionality</p></td>
            <td>
                <p>This value is the number of dimensions that the data object
                    has.</p>
            </td>
        </tr>

        <tr>
            <td><p>Flags</p></td>
            <td>
                <p>This field is used to store flags to indicate the presence of
                    parts of this message. Bit 0 (the least significant bit) is used to
                    indicate that maximum dimensions are present.</p>
            </td>
        </tr>

        <tr>
            <td><p>Type</p></td>
            <td>
                <p>This field indicates the type of the dataspace:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>A <em>scalar</em> dataspace; in other words, a dataspace
                            with a single, dimensionless element.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>A <em>simple</em> dataspace; in other words, a dataspace
                            with a rank > 0 and an appropriate # of dimensions.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>A <em>null</em> dataspace; in other words, a dataspace
                            with no elements.
                        </td>
                    </tr>
                </table>
                <p></p>
            </td>
        </tr>

        <tr>
            <td><p>Dimension #n Size</p></td>
            <td>
                <p>This value is the current size of the dimension of the data
                    as stored in the file. The first dimension stored in the list of
                    dimensions is the slowest changing dimension and the last dimension
                    stored is the fastest changing dimension.</p>
            </td>
        </tr>

        <tr>
            <td><p>Dimension #n Maximum Size</p></td>
            <td>
                <p>
                    This value is the maximum size of the dimension of the data as
                    stored in the file. This value may be the special &ldquo;<a
                        href="#UnlimitedDim">unlimited</a>&rdquo; size which indicates
                    that the data may expand along this dimension indefinitely. If
                    these values are not stored, the maximum size of each dimension is
                    assumed to be the dimension&rsquo;s current size.
                </p>
            </td>
        </tr>

    </table>
</div>



<!--
<br />
<h4><a name="DataSpaceMessage">Header Message Name: Complex Dataspace (Fiber Bundle?)</a></h4>

    <!-- start msgdesc table --
    <center>
    <table class="msgdesc">
    <p><b>Header Message Name: ???????</b></td></tr>
    <b>Header Message Type: </b>0x0002<br />
    <b>Length:</b> Varies</td></tr>

    <b>Status:</b> One of the <em>Simple Dataspace</em> or
    <em>Complex Dataspace</em> messages is required (but not both) and may
    not be repeated.<br /> <b>Description:</b> The
    <em>Dataspace</em> message describes space that the dataset is
    mapped onto in a more comprehensive way than the <em>Simple
    Dimensionality</em> message is capable of handling.  The
    dataspace of a dataset encompasses the type of coordinate system
    used to locate the dataset&rsquo;s elements as well as the structure and
    regularity of the coordinate system.  The dataspace also
    describes the number of dimensions which the dataset inhabits as
    well as a possible higher dimensional space in which the dataset
    is located within.

    <br />
    <p><b>Format of Data:</b></p>

    <center>
      <table border cellpadding="4" width="80%">
    <caption align="bottom">
      <b>HDF5 Dataspace Message Layout</b>
    </caption>

    <tr align="center">
      <th width="25%">byte</th>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
      </tr>

    <tr align="center">
      <td colspan="4">Mesh Type</td>
      </tr>
    <tr align="center">
      <td colspan="4">Logical Dimensionality</td>
      </tr>
      </table>
    </center>

    <br />
    <dl>
      <dt>The elements of the dimensionality message are described below:
      <dd>
    <dl>
      <dt>Mesh Type: (unsigned 32-bit integer)
      <dd>This value indicates whether the grid is
        polar/spherical/cartesian,
        structured/unstructured and regular/irregular. <br />
        The mesh type value is broken up as follows: <br />

        <br />
        <center>
          <table border cellpadding="4" width="80%">
        <caption align="bottom">
          <b>HDF5 Mesh-type Layout</b>
        </caption>

        <tr align="center">
          <th width="25%">byte</th>
          <th width="25%">byte</th>
          <th width="25%">byte</th>
          <th width="25%">byte</th>
        </tr>

        <tr align="center">
          <td colspan="1">Mesh Embedding</td>
          <td colspan="1">Coordinate System</td>
          <td colspan="1">Structure</td>
          <td colspan="1">Regularity</td>
        </tr>
          </table>
        </center>
        The following are the definitions of mesh-type bytes:
        <dl>
          <dt>Mesh Embedding
          <dd>This value indicates whether the dataset dataspace
        is located within
        another dataspace or not:
        <dl> <dl>
            <dt>&lt;STANDALONE&gt;
            <dd>The dataset mesh is self-contained and is not
              embedded in another mesh.
            <dt>&lt;EMBEDDED&gt;
            <dd>The dataset&rsquo;s dataspace is located within
              another dataspace, as
              described in information below.
          </dl> </dl>
          <dt>Coordinate System
          <dd>This value defines the type of coordinate system
        used for the mesh:
        <dl> <dl>
            <dt>&lt;POLAR&gt;
            <dd>The last two dimensions are in polar
              coordinates, higher dimensions are
              cartesian.
            <dt>&lt;SPHERICAL&gt;
            <dd>The last three dimensions are in spherical
              coordinates, higher dimensions
              are cartesian.
            <dt>&lt;CARTESIAN&gt;
            <dd>All dimensions are in cartesian coordinates.
          </dl> </dl>
          <dt>Structure
          <dd>This value defines the locations of the grid-points
        on the axes:
        <dl> <dl>
            <dt>&lt;STRUCTURED&gt;
            <dd>All grid-points are on integral, sequential
              locations, starting from 0.
            <dt>&lt;UNSTRUCTURED&gt;
            <dd>Grid-points locations in each dimension are
              explicitly defined and
              may be of any numeric datatype.
          </dl> </dl>
          <dt>Regularity
          <dd>This value defines the locations of the dataset
        points on the grid:
        <dl> <dl>
            <dt>&lt;REGULAR&gt;
            <dd>All dataset elements are located at the
              grid-points defined.
            <dt>&lt;IRREGULAR&gt;
            <dd>Each dataset element has a particular
              grid-location defined.
          </dl> </dl>
        </dl>
        <p>The following grid combinations are currently allowed:</p>
        <dl> <dl>
        <dt>&lt;POLAR-STRUCTURED-REGULAR&gt;
        <dt>&lt;SPHERICAL-STRUCTURED-REGULAR&gt;
        <dt>&lt;CARTESIAN-STRUCTURED-REGULAR&gt;
        <dt>&lt;POLAR-UNSTRUCTURED-REGULAR&gt;
        <dt>&lt;SPHERICAL-UNSTRUCTURED-REGULAR&gt;
        <dt>&lt;CARTESIAN-UNSTRUCTURED-REGULAR&gt;
        <dt>&lt;CARTESIAN-UNSTRUCTURED-IRREGULAR&gt;
          </dl> </dl>
        All of the above grid types can be embedded within another
        dataspace.
        <br /> <br />
      <dt>Logical Dimensionality: (unsigned 32-bit integer)
      <dd>This value is the number of dimensions that the dataset occupies.

        <br />
        <center>
          <table border cellpadding="4" width="80%">
        <caption align="bottom">
          <b>HDF5 Dataspace Embedded Dimensionality Information</b>
        </caption>

        <tr align="center">
          <th width="25%">byte</th>
          <th width="25%">byte</th>
          <th width="25%">byte</th>
          <th width="25%">byte</th>
        </tr>

        <tr align="center">
          <td colspan="4">Embedded Dimensionality</td>
        </tr>
        <tr align="center">
          <td colspan="4">Embedded Dimension Size #1</td>
        </tr>
        <tr align="center">
          <td colspan="4">.<br />.<br />.<br /></td>
        </tr>
        <tr align="center">
          <td colspan="4">Embedded Dimension Size #n</td>
        </tr>
        <tr align="center">
          <td colspan="4">Embedded Origin Location #1</td>
        </tr>
        <tr align="center">
          <td colspan="4">.<br />.<br />.<br /></td>
        </tr>
        <tr align="center">
          <td colspan="4">Embedded Origin Location #n</td>
        </tr>
          </table>
        </center>

      <dt>Embedded Dimensionality: (unsigned 32-bit integer)
      <dd>This value is the number of dimensions of the space the
        dataset is located within: in other words, a planar dataset
        located within a 3-D space, a 3-D dataset
        which is a subset of another 3-D space, and so on.
      <dt>Embedded Dimension Size: (unsigned 32-bit integer)
      <dd>These values are the sizes of the dimensions of the
        embedded dataspace
        that the dataset is located within.
      <dt>Embedded Origin Location: (unsigned 32-bit integer)
      <dd>These values comprise the location of the dataset&rsquo;s
        origin within the embedded dataspace.
    </dl>
    </dl>
    [Comment: need some way to handle different orientations of the
    dataset dataspace
    within the embedded dataspace]<br />

    <br />
    <center>
      <table border cellpadding="4" width="80%">
    <caption align="bottom">
      <b>HDF5 Dataspace Structured/Regular Grid Information</b>
    </caption>

    <tr align="center">
      <th width="25%">byte</th>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
    </tr>

    <tr align="center">
      <td colspan="4">Logical Dimension Size #1</td>
    </tr>
    <tr align="center">
      <td colspan="4">Logical Dimension Maximum #1</td>
    </tr>
    <tr align="center">
      <td colspan="4">.<br />.<br />.<br /></td>
    </tr>
    <tr align="center">
      <td colspan="4">Logical Dimension Size #n</td>
    </tr>
    <tr align="center">
      <td colspan="4">Logical Dimension Maximum #n</td>
    </tr>
      </table>
    </center>

    <br />
    <dl>
      <dt>The elements of the dimensionality message are described below:
      <dd>
    <dl>
      <dt>Logical Dimension Size #n: (unsigned 32-bit integer)
      <dd>This value is the current size of the dimension of the
        data as stored in
        the file.  The first dimension stored in the list of
        dimensions is the slowest
        changing dimension and the last dimension stored is the
        fastest changing
        dimension.
      <dt>Logical Dimension Maximum #n: (unsigned 32-bit integer)
      <dd>This value is the maximum size of the dimension of the
        data as stored in
        the file.  This value may be the special value
        &lt;UNLIMITED&gt; which
        indicates that the data may expand along this dimension
        indefinitely.
    </dl>
    </dl>
    <br />
    <center>
      <table border cellpadding="4" width="80%">
    <caption align="bottom">
      <b>HDF5 Dataspace Structured/Irregular Grid Information</b>
    </caption>

    <tr align="center">
      <th width="25%">byte</th>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
    </tr>

    <tr align="center">
      <td colspan="4"># of Grid Points in Dimension #1</td>
    </tr>
    <tr align="center">
      <td colspan="4">.<br />.<br />.<br /></td>
    </tr>
    <tr align="center">
      <td colspan="4"># of Grid Points in Dimension #n</td>
    </tr>
    <tr align="center">
      <td colspan="4">Datatype of Grid Point Locations</td>
    </tr>
    <tr align="center">
      <td colspan="4">Location of Grid Points in Dimension #1</td>
    </tr>
    <tr align="center">
      <td colspan="4">.<br />.<br />.<br /></td>
    </tr>
    <tr align="center">
      <td colspan="4">Location of Grid Points in Dimension #n</td>
    </tr>
      </table>
    </center>

    <br />
    <center>
      <table border cellpadding="4" width="80%">
    <caption align="bottom">
      <b>HDF5 Dataspace Unstructured Grid Information</b>
    </caption>

    <tr align="center">
      <th width="25%">byte</th>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
    </tr>

    <tr align="center">
      <td colspan="4"># of Grid Points</td>
    </tr>
    <tr align="center">
      <td colspan="4">Datatype of Grid Point Locations</td>
    </tr>
    <tr align="center">
      <td colspan="4">Grid Point Locations<br />.<br />.<br /></td>
    </tr>
      </table>
    </center>
-->

<br />
<h4>
    <a name="LinkInfoMessage">IV.A.2.c. The Link Info Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Link Info</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x002</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>The link info message tracks variable information about the
                current state of the links for a &ldquo;new style&rdquo;
                group&rsquo;s behavior. Variable information will be stored in this
                message and constant information will be stored in the <a
                href="#GroupInfoMessage">Group Info</a> message.
            </td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Link Info</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Flags</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Maximum Creation Index <em>(8 bytes,
                    optional)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Fractal Heap Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of v2 B-tree for Name Index<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address of v2 B-tree for Creation Order
                Index<sup>O</sup> <em>(optional)</em><br />
            <br /></td>
        </tr>

    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>The version number for this message. This document describes
                    version 0.</p>
            </td>
        </tr>

        <tr>
            <td><p>Flags</p></td>
            <td><p>This field determines various optional aspects of the
                    link info message:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>If set, creation order for the links is tracked.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>If set, creation order for the links is indexed.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>2-7</code></td>
                        <td>Reserved</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Maximum Creation Index</p></td>
            <td><p>This 64-bit value is the maximum creation order index
                    value stored for a link in this group.</p>
                <p>
                    This field is present if bit 0 of <em>flags</em> is set.
                </p></td>
        </tr>

        <tr>
            <td><p>Fractal Heap Address</p></td>
            <td>
                <p>
                    This is the address of the fractal heap to store dense links. Each
                    link stored in the fractal heap is stored as a <a
                        href="#LinkMessage">Link Message</a>.
                </p>
                <p>
                    If there are no links in the group, or the group&rsquo;s links are
                    stored &ldquo;compactly&rdquo; (as object header messages), this
                    value will be the <a href="#UndefinedAddress">undefined address</a>.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Address of v2 B-tree for Name Index</p></td>
            <td><p>This is the address of the version 2 B-tree to index
                    names of links.</p>
                <p>
                    If there are no links in the group, or the group&rsquo;s links are
                    stored &ldquo;compactly&rdquo; (as object header messages), this
                    value will be the <a href="#UndefinedAddress">undefined address</a>.
                </p></td>
        </tr>

        <tr>
            <td><p>Address of v2 B-tree for Creation Order Index</p></td>
            <td><p>This is the address of the version 2 B-tree to index
                    creation order of links.</p>
                <p>
                    If there are no links in the group, or the group&rsquo;s links are
                    stored &ldquo;compactly&rdquo; (as object header messages), this
                    value will be the <a href="#UndefinedAddress">undefined address</a>.
                </p>
                <p>
                    This field exists if bit 1 of <em>flags</em> is set.
                </p></td>
        </tr>

    </table>
</div>


<br />
<h4>
    <a name="DatatypeMessage">IV.A.2.d. The Datatype Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Datatype</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0003</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Variable</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Required for dataset or committed
                datatype (formerly named datatype) objects; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td><p>The datatype message defines the datatype for each
                    element of a dataset or a common datatype for sharing between
                    multiple datasets. A datatype can describe an atomic type like a
                    fixed- or floating-point type or more complex types like a C struct
                    (compound datatype), array (array datatype) or C++ vector
                    (variable-length datatype).</p>
                <p>Datatype messages that are part of a dataset object do not
                    describe how elements are related to one another; the dataspace
                    message is used for that purpose. Datatype messages that are part
                    of a committed datatype (formerly named datatype) message describe
                    a common datatype that can be shared by multiple datasets in the
                    file.</p></td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Datatype Message</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Class and Version</td>
            <td>Class Bit Field, Bits 0-7</td>
            <td>Class Bit Field, Bits 8-15</td>
            <td>Class Bit Field, Bits 16-23</td>
        </tr>

        <tr>
            <td colspan="4">Size</td>
        </tr>

        <tr>
            <td colspan="4"><br />
            <br />Properties<br />
            <br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Class and Version</p></td>
            <td>
                <p>The version of the datatype message and the datatype&rsquo;s
                    class information are packed together in this field. The version
                    number is packed in the top 4 bits of the field and the class is
                    contained in the bottom 4 bits.</p>
                <p>The version number information is used for changes in the
                    format of the datatype message and is described here:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Version</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Never used</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Used by early versions of the library to encode compound
                            datatypes with explicit array fields. See the compound datatype
                            description below for further details.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Used when an array datatype needs to be encoded.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>Used when a VAX byte-ordered type needs to be encoded.
                            Packs various other datatype classes more efficiently also.</td>
                    </tr>
                </table>
                <p></p>

                <p>The class of the datatype determines the format for the class
                    bit field and properties portion of the datatype message, which are
                    described below. The following classes are currently defined:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Fixed-Point</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Floating-Point</td>
                    </tr>

                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Time</td>
                    </tr>

                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>String</td>
                    </tr>

                    <tr>
                        <td align="center"><code>4</code></td>
                        <td>Bit field</td>
                    </tr>

                    <tr>
                        <td align="center"><code>5</code></td>
                        <td>Opaque</td>
                    </tr>

                    <tr>
                        <td align="center"><code>6</code></td>
                        <td>Compound</td>
                    </tr>

                    <tr>
                        <td align="center"><code>7</code></td>
                        <td>Reference</td>
                    </tr>

                    <tr>
                        <td align="center"><code>8</code></td>
                        <td>Enumerated</td>
                    </tr>

                    <tr>
                        <td align="center"><code>9</code></td>
                        <td>Variable-Length</td>
                    </tr>

                    <tr>
                        <td align="center"><code>10</code></td>
                        <td>Array</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Class Bit Fields</p></td>
            <td>
                <p>The information in these bit fields is specific to each
                    datatype class and is described below. All bits not defined for a
                    datatype class are set to zero.</p>
            </td>
        </tr>

        <tr>
            <td><p>Size</p></td>
            <td>
                <p>The size of a datatype element in bytes.</p>
            </td>
        </tr>

        <tr>
            <td><p>Properties</p></td>
            <td>
                <p>This variable-sized sequence of bytes encodes information
                    specific to each datatype class and is described for each class
                    below. If there is no property information specified for a datatype
                    class, the size of this field is zero bytes.</p>
            </td>
        </tr>

    </table>
</div>


<br />
<p>Class specific information for Fixed-Point Numbers (Class 0):</p>

<div align="center">
    <table class="desc">
        <caption>Fixed-point Bit Field Description</caption>

        <tr>
            <th width="10%">Bits</th>
            <th>Meaning</th>
        </tr>

        <tr>
            <td><p>0</p></td>
            <td><p>
                    <b>Byte Order.</b> If zero, byte order is little-endian; otherwise,
                    byte order is big endian.
                </p></td>
        </tr>

        <tr>
            <td><p>1, 2</p></td>
            <td><p>
                    <b>Padding type.</b> Bit 1 is the lo_pad bit and bit 2 is the
                    hi_pad bit. If a datum has unused bits at either end, then the
                    lo_pad or hi_pad bit is copied to those locations.
                </p></td>
        </tr>

        <tr>
            <td><p>3</p></td>
            <td><p>
                    <b>Signed.</b> If this bit is set then the fixed-point number is in
                    2&rsquo;s complement form.
                </p></td>
        </tr>

        <tr>
            <td><p>4-23</p></td>
            <td><p>Reserved (zero).</p></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="format">
        <caption>Fixed-Point Property Description</caption>

        <tr>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
        </tr>

        <tr>
            <td colspan="2">Bit Offset</td>
            <td colspan="2">Bit Precision</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Bit Offset</p></td>
            <td>
                <p>The bit offset of the first significant bit of the
                    fixed-point value within the datatype. The bit offset specifies the
                    number of bits &ldquo;to the right of&rdquo; the value (which are
                    set to the lo_pad bit value).</p>
            </td>
        </tr>

        <tr>
            <td><p>Bit Precision</p></td>
            <td>
                <p>The number of bits of precision of the fixed-point value
                    within the datatype. This value, combined with the datatype
                    element&rsquo;s size and the Bit Offset field specifies the number
                    of bits &ldquo;to the left of&rdquo; the value (which are set to
                    the hi_pad bit value).</p>
            </td>
        </tr>

    </table>
</div>


<br />
<p>Class specific information for Floating-Point Numbers (Class 1):</p>

<div align="center">
    <table class="desc">
        <caption>Floating-Point Bit Field Description</caption>

        <tr>
            <th width="10%">Bits</th>
            <th>Meaning</th>
        </tr>

        <tr>
            <td><p>0, 6</p></td>
            <td><p>
                    <b>Byte Order.</b> These two non-contiguous bits specify the
                    &ldquo;endianness&rdquo; of the bytes in the datatype element.
                </p>
                <table class="list">
                    <tr>
                        <th width="10%" align="center">Bit 6</th>
                        <th width="10%" align="center">Bit 0</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td align="center"><code>0</code></td>
                        <td>Byte order is little-endian</td>
                    </tr>
                    <tr>
                        <td align="center"><code>0</code></td>
                        <td align="center"><code>1</code></td>
                        <td>Byte order is big-endian</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td align="center"><code>0</code></td>
                        <td>Reserved</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td align="center"><code>1</code></td>
                        <td>Byte order is VAX-endian</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>1, 2, 3</p></td>
            <td><p>
                    <b>Padding type.</b> Bit 1 is the low bits pad type, bit 2 is the
                    high bits pad type, and bit 3 is the internal bits pad type. If a
                    datum has unused bits at either end or between the sign bit,
                    exponent, or mantissa, then the value of bit 1, 2, or 3 is copied
                    to those locations.
                </p></td>
        </tr>

        <tr>
            <td><p>4-5</p></td>
            <td><p>
                    <b>Mantissa Normalization.</b> This 2-bit bit field specifies how
                    the most significant bit of the mantissa is managed.
                </p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>No normalization</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>The most significant bit of the mantissa is always set
                            (except for 0.0).</td>
                    </tr>
                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>The most significant bit of the mantissa is not stored,
                            but is implied to be set.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>Reserved.</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>7</p></td>
            <td><p>Reserved (zero).</p></td>
        </tr>

        <tr>
            <td><p>8-15</p></td>
            <td><p>
                    <b>Sign Location.</b> This is the bit position of the sign bit.
                    Bits are numbered with the least significant bit zero.
                </p></td>
        </tr>

        <tr>
            <td><p>16-23</p></td>
            <td><p>Reserved (zero).</p></td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Floating-Point Property Description</caption>

        <tr>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
        </tr>

        <tr>
            <td colspan="2">Bit Offset</td>
            <td colspan="2">Bit Precision</td>
        </tr>

        <tr>
            <td>Exponent Location</td>
            <td>Exponent Size</td>
            <td>Mantissa Location</td>
            <td>Mantissa Size</td>
        </tr>

        <tr>
            <td colspan="4">Exponent Bias</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Bit Offset</p></td>
            <td>
                <p>The bit offset of the first significant bit of the
                    floating-point value within the datatype. The bit offset specifies
                    the number of bits &ldquo;to the right of&rdquo; the value.</p>
            </td>
        </tr>

        <tr>
            <td><p>Bit Precision</p></td>
            <td>
                <p>The number of bits of precision of the floating-point value
                    within the datatype.</p>
            </td>
        </tr>

        <tr>
            <td><p>Exponent Location</p></td>
            <td>
                <p>The bit position of the exponent field. Bits are numbered
                    with the least significant bit number zero.</p>
            </td>
        </tr>

        <tr>
            <td><p>Exponent Size</p></td>
            <td>
                <p>The size of the exponent field in bits.</p>
            </td>
        </tr>

        <tr>
            <td><p>Mantissa Location</p></td>
            <td>
                <p>The bit position of the mantissa field. Bits are numbered
                    with the least significant bit number zero.</p>
            </td>
        </tr>

        <tr>
            <td><p>Mantissa Size</p></td>
            <td>
                <p>The size of the mantissa field in bits.</p>
            </td>
        </tr>

        <tr>
            <td><p>Exponent Bias</p></td>
            <td>
                <p>The bias of the exponent field.</p>
            </td>
        </tr>

    </table>
</div>


<br />
<p>Class specific information for Time (Class 2):</p>


<div align="center">
    <table class="desc">
        <caption>Time Bit Field Description</caption>

        <tr>
            <th width="10%">Bits</th>
            <th>Meaning</th>
        </tr>

        <tr>
            <td><p>0</p></td>
            <td><p>
                    <b>Byte Order.</b> If zero, byte order is little-endian; otherwise,
                    byte order is big endian.
                </p></td>
        </tr>

        <tr>
            <td><p>1-23</p></td>
            <td><p>Reserved (zero).</p></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="format">
        <caption>Time Property Description</caption>

        <tr>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
        </tr>

        <tr>
            <td colspan="2">Bit Precision</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Bit Precision</p></td>
            <td>
                <p>The number of bits of precision of the time value.</p>
            </td>
        </tr>

    </table>
</div>


<br />
<p>Class specific information for Strings (Class 3):</p>


<div align="center">
    <table class="desc">
        <caption>String Bit Field Description</caption>

        <tr>
            <th width="10%">Bits</th>
            <th>Meaning</th>
        </tr>

        <tr>
            <td><p>0-3</p></td>
            <td><p>
                    <b>Padding type.</b> This four-bit value determines the type of
                    padding to use for the string. The values are:

                </p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Null Terminate: A zero byte marks the end of the string
                            and is guaranteed to be present after converting a long string to
                            a short string. When converting a short string to a long string
                            the value is padded with additional null characters as necessary.
                        </td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Null Pad: Null characters are added to the end of the
                            value during conversions from short values to long values but
                            conversion in the opposite direction simply truncates the value.
                        </td>
                    </tr>

                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Space Pad: Space characters are added to the end of the
                            value during conversions from short values to long values but
                            conversion in the opposite direction simply truncates the value.
                            This is the Fortran representation of the string.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>3-15</code></td>
                        <td>Reserved</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>4-7</p></td>
            <td><p>
                    <b>Character Set.</b> The character set used to encode the string.
                </p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>ASCII character set encoding</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>UTF-8 character set encoding</td>
                    </tr>

                    <tr>
                        <td align="center"><code>2-15</code></td>
                        <td>Reserved</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>8-23</p></td>
            <td><p>Reserved (zero).</p></td>
        </tr>
    </table>
</div>

<p>There are no properties defined for the string class.</p>


<p>Class specific information for bit fields (Class 4):</p>

<div align="center">
    <table class="desc">
        <caption>Bitfield Bit Field Description</caption>

        <tr>
            <th width="10%">Bits</th>
            <th>Meaning</th>
        </tr>

        <tr>
            <td><p>0</p></td>
            <td><p>
                    <b>Byte Order.</b> If zero, byte order is little-endian; otherwise,
                    byte order is big endian.
                </p></td>
        </tr>

        <tr>
            <td><p>1, 2</p></td>
            <td><p>
                    <b>Padding type.</b> Bit 1 is the lo_pad type and bit 2 is the
                    hi_pad type. If a datum has unused bits at either end, then the
                    lo_pad or hi_pad bit is copied to those locations.
                </p></td>
        </tr>

        <tr>
            <td><p>3-23</p></td>
            <td><p>Reserved (zero).</p></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="format">
        <caption>Bit Field Property Description</caption>

        <tr>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
        </tr>

        <tr>
            <td colspan="2">Bit Offset</td>
            <td colspan="2">Bit Precision</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Bit Offset</p></td>
            <td>
                <p>The bit offset of the first significant bit of the bit field
                    within the datatype. The bit offset specifies the number of bits
                    &ldquo;to the right of&rdquo; the value.</p>
            </td>
        </tr>

        <tr>
            <td><p>Bit Precision</p></td>
            <td>
                <p>The number of bits of precision of the bit field within the
                    datatype.</p>
            </td>
        </tr>
    </table>
</div>


<br />
<p>Class specific information for Opaque (Class 5):</p>

<div align="center">
    <table class="desc">
        <caption>Opaque Bit Field Description</caption>

        <tr>
            <th width="10%">Bits</th>
            <th>Meaning</th>
        </tr>

        <tr>
            <td><p>0-7</p></td>
            <td><p>Length of ASCII tag in bytes.</p></td>
        </tr>

        <tr>
            <td><p>8-23</p></td>
            <td><p>Reserved (zero).</p></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="format">
        <caption>Opaque Property Description</caption>

        <tr>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />ASCII Tag<br /> <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>ASCII Tag</p></td>
            <td>
                <p>This NUL-terminated string provides a description for the
                    opaque type. It is NUL-padded to a multiple of 8 bytes.</p>
            </td>
        </tr>
    </table>
</div>


<br />
<p>Class specific information for Compound (Class 6):</p>

<div align="center">
    <table class="desc">
        <caption>Compound Bit Field Description</caption>

        <tr>
            <th width="10%">Bits</th>
            <th>Meaning</th>
        </tr>

        <tr>
            <td><p>0-15</p></td>
            <td><p>
                    <b>Number of Members.</b> This field contains the number of members
                    defined for the compound datatype. The member definitions are
                    listed in the Properties field of the data type message.
                </p></td>
        </tr>

        <tr>
            <td><p>16-23</p></td>
            <td><p>Reserved (zero).</p></td>
        </tr>
    </table>
</div>


<p>The Properties field of a compound datatype is a list of the
    member definitions of the compound datatype. The member definitions
    appear one after another with no intervening bytes. The member types
    are described with a (recursively) encoded datatype message.</p>

<p>Note that the property descriptions are different for different
    versions of the datatype version. Additionally note that the version 0
    datatype encoding is deprecated and has been replaced with later
    encodings in versions of the HDF5 Library from the 1.4 release onward.</p>


<div align="center">
    <table class="format">
        <caption>Compound Properties Description for Datatype
            Version 1</caption>

        <tr>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Name<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Byte Offset of Member</td>
        </tr>

        <tr>
            <td>Dimensionality</td>
            <td colspan="3">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4">Dimension Permutation</td>
        </tr>

        <tr>
            <td colspan="4">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4">Dimension #1 Size (required)</td>
        </tr>

        <tr>
            <td colspan="4">Dimension #2 Size (required)</td>
        </tr>

        <tr>
            <td colspan="4">Dimension #3 Size (required)</td>
        </tr>

        <tr>
            <td colspan="4">Dimension #4 Size (required)</td>
        </tr>

        <tr>
            <td colspan="4"><br />Member Type Message<br />
            <br /></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Name</p></td>
            <td>
                <p>This NUL-terminated string provides a description for the
                    opaque type. It is NUL-padded to a multiple of 8 bytes.</p>
            </td>
        </tr>

        <tr>
            <td><p>Byte Offset of Member</p></td>
            <td>
                <p>This is the byte offset of the member within the datatype.</p>
            </td>
        </tr>

        <tr>
            <td><p>Dimensionality</p></td>
            <td>
                <p>If set to zero, this field indicates a scalar member. If set
                    to a value greater than zero, this field indicates that the member
                    is an array of values. For array members, the size of the array is
                    indicated by the &lsquo;Size of Dimension n&rsquo; field in this
                    message.</p>
            </td>
        </tr>

        <tr>
            <td><p>Dimension Permutation</p></td>
            <td>
                <p>This field was intended to allow an array field to have its
                    dimensions permuted, but this was never implemented. This field
                    should always be set to zero.</p>
            </td>
        </tr>

        <tr>
            <td><p>Dimension #n Size</p></td>
            <td>
                <p>This field is the size of a dimension of the array field as
                    stored in the file. The first dimension stored in the list of
                    dimensions is the slowest changing dimension and the last dimension
                    stored is the fastest changing dimension.</p>
            </td>
        </tr>

        <tr>
            <td><p>Member Type Message</p></td>
            <td>
                <p>This field is a datatype message describing the datatype of
                    the member.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Compound Properties Description for Datatype
            Version 2</caption>

        <tr>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Name<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Byte Offset of Member</td>
        </tr>

        <tr>
            <td colspan="4"><br />Member Type Message<br />
            <br /></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Name</p></td>
            <td>
                <p>This NUL-terminated string provides a description for the
                    opaque type. It is NUL-padded to a multiple of 8 bytes.</p>
            </td>
        </tr>

        <tr>
            <td><p>Byte Offset of Member</p></td>
            <td>
                <p>This is the byte offset of the member within the datatype.</p>
            </td>
        </tr>

        <tr>
            <td><p>Member Type Message</p></td>
            <td>
                <p>This field is a datatype message describing the datatype of
                    the member.</p>
            </td>
        </tr>

    </table>
</div>


<br />
<br />
<div align="center">
    <table class="format">
        <caption>Compound Properties Description for Datatype
            Version 3</caption>

        <tr>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Name<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Byte Offset of Member <em>(variable size)</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Member Type Message<br />
            <br /></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Name</p></td>
            <td><p>
                    This NUL-terminated string provides a description for the opaque
                    type. It is <em>not</em> NUL-padded to a multiple of 8 bytes.
                </p></td>
        </tr>

        <tr>
            <td><p>Byte Offset of Member</p></td>
            <td><p>This is the byte offset of the member within the
                    datatype. The field size is the minimum number of bytes necessary,
                    based on the size of the datatype element. For example, a datatype
                    element size of less than 256 bytes uses a 1 byte length, a
                    datatype element size of 256-65535 bytes uses a 2 byte length, and
                    so on.</p></td>
        </tr>

        <tr>
            <td><p>Member Type Message</p></td>
            <td><p>This field is a datatype message describing the
                    datatype of the member.</p></td>
        </tr>

    </table>
</div>


<br />
<p>Class specific information for Reference (Class 7):</p>

<div align="center">
    <table class="desc">
        <caption>Reference Bit Field Description</caption>

        <tr>
            <th width="10%">Bits</th>
            <th>Meaning</th>
        </tr>

        <tr>
            <td><p>0-3</p></td>
            <td><p>
                    <b>Type.</b> This four-bit value contains the type of reference
                    described. The values defined are:

                </p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Object Reference: A reference to another object in this
                            HDF5 file.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Dataset Region Reference: A reference to a region within
                            a dataset in this HDF5 file.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>2-15</code></td>
                        <td>Reserved</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>4-23</p></td>
            <td><p>Reserved (zero).</p></td>
        </tr>
    </table>
</div>

<p>There are no properties defined for the reference class.</p>


<br />
<p>Class specific information for Enumeration (Class 8):</p>

<div align="center">
    <table class="desc">
        <caption>Enumeration Bit Field Description</caption>

        <tr>
            <th width="10%">Bits</th>
            <th>Meaning</th>
        </tr>

        <tr>
            <td><p>0-15</p></td>
            <td><p>
                    <b>Number of Members.</b> The number of name/value pairs defined
                    for the enumeration type.
                </p></td>
        </tr>

        <tr>
            <td><p>16-23</p></td>
            <td><p>Reserved (zero).</p></td>
        </tr>
    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Enumeration Property Description for Datatype
            Versions 1 & 2</caption>

        <tr>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Base Type<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Names<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Values<br />
            <br /></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Base Type</p></td>
            <td>
                <p>Each enumeration type is based on some parent type, usually
                    an integer. The information for that parent type is described
                    recursively by this field.</p>
            </td>
        </tr>

        <tr>
            <td><p>Names</p></td>
            <td>
                <p>The name for each name/value pair. Each name is stored as a
                    null terminated ASCII string in a multiple of eight bytes. The
                    names are in no particular order.</p>
            </td>
        </tr>

        <tr>
            <td><p>Values</p></td>
            <td>
                <p>The list of values in the same order as the names. The values
                    are packed (no inter-value padding) and the size of each value is
                    determined by the parent type.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Enumeration Property Description for Datatype
            Version 3</caption>

        <tr>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Base Type<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Names<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Values<br />
            <br /></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Base Type</p></td>
            <td>
                <p>Each enumeration type is based on some parent type, usually
                    an integer. The information for that parent type is described
                    recursively by this field.</p>
            </td>
        </tr>

        <tr>
            <td><p>Names</p></td>
            <td>
                <p>
                    The name for each name/value pair. Each name is stored as a null
                    terminated ASCII string, <em>not</em> padded to a multiple of eight
                    bytes. The names are in no particular order.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Values</p></td>
            <td>
                <p>The list of values in the same order as the names. The values
                    are packed (no inter-value padding) and the size of each value is
                    determined by the parent type.</p>
            </td>
        </tr>

    </table>
</div>



<br />
<p>Class specific information for Variable-Length (Class 9):</p>

<div align="center">
    <table class="desc">
        <caption>Variable-Length Bit Field Description</caption>

        <tr>
            <th width="10%">Bits</th>
            <th>Meaning</th>
        </tr>

        <tr>
            <td><p>0-3</p></td>
            <td><p>
                    <b>Type.</b> This four-bit value contains the type of
                    variable-length datatype described. The values defined are:

                </p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Sequence: A variable-length sequence of any datatype.
                            Variable-length sequences do not have padding or character set
                            information.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>String: A variable-length sequence of characters.
                            Variable-length strings have padding and character set
                            information.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>2-15</code></td>
                        <td>Reserved</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>4-7</p></td>
            <td><p>
                    <b>Padding type.</b> (variable-length string only) This four-bit
                    value determines the type of padding used for variable-length
                    strings. The values are the same as for the string padding type, as
                    follows:
                </p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Null terminate: A zero byte marks the end of a string and
                            is guaranteed to be present after converting a long string to a
                            short string. When converting a short string to a long string,
                            the value is padded with additional null characters as necessary.
                        </td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Null pad: Null characters are added to the end of the
                            value during conversion from a short string to a longer string.
                            Conversion from a long string to a shorter string simply
                            truncates the value.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Space pad: Space characters are added to the end of the
                            value during conversion from a short string to a longer string.
                            Conversion from a long string to a shorter string simply
                            truncates the value. This is the Fortran representation of the
                            string.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>3-15</code></td>
                        <td>Reserved</td>
                    </tr>
                </table>
                <p></p>

                <p>This value is set to zero for variable-length sequences.</p></td>
        </tr>

        <tr>
            <td><p>8-11</p></td>
            <td><p>
                    <b>Character Set.</b> (variable-length string only) This four-bit
                    value specifies the character set to be used for encoding the
                    string:
                </p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>ASCII character set encoding</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>UTF-8 character set encoding</td>
                    </tr>

                    <tr>
                        <td align="center"><code>2-15</code></td>
                        <td>Reserved</td>
                    </tr>
                </table>
                <p></p>

                <p>This value is set to zero for variable-length sequences.</p></td>
        </tr>

        <tr>
            <td><p>12-23</p></td>
            <td><p>Reserved (zero).</p></td>
        </tr>
    </table>
</div>

<br />
<br />
<div align="center">
    <table class="format">
        <caption>Variable-Length Property Description</caption>

        <tr>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Base Type<br />
            <br /></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="10%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Base Type</p></td>
            <td>
                <p>Each variable-length type is based on some parent type. The
                    information for that parent type is described recursively by this
                    field.</p>
            </td>
        </tr>

    </table>
</div>


<br />
<p>Class specific information for Array (Class 10):</p>

<p>There are no bit fields defined for the array class.</p>

<p>Note that the dimension information defined in the property for
    this datatype class is independent of dataspace information for a
    dataset. The dimension information here describes the dimensionality of
    the information within a data element (or a component of an element, if
    the array datatype is nested within another datatype) and the dataspace
    for a dataset describes the size and locations of the elements in a
    dataset.</p>


<div align="center">
    <table class="format">
        <caption>Array Property Description for Datatype Version 2</caption>

        <tr>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
        </tr>

        <tr>
            <td>Dimensionality</td>
            <td colspan="3">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4">Dimension #1 Size</td>
        </tr>
        <tr>
            <td colspan="4">.<br />.<br />.<br /></td>
        </tr>
        <tr>
            <td colspan="4">Dimension #n Size</td>
        </tr>

        <tr>
            <td colspan="4">Permutation Index #1</td>
        </tr>
        <tr>
            <td colspan="4">.<br />.<br />.<br /></td>
        </tr>
        <tr>
            <td colspan="4">Permutation Index #n</td>
        </tr>

        <tr>
            <td colspan="4"><br />Base Type<br />
            <br /></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Dimensionality</p></td>
            <td>
                <p>This value is the number of dimensions that the array has.</p>
            </td>
        </tr>

        <tr>
            <td><p>Dimension #n Size</p></td>
            <td>
                <p>This value is the size of the dimension of the array as
                    stored in the file. The first dimension stored in the list of
                    dimensions is the slowest changing dimension and the last dimension
                    stored is the fastest changing dimension.</p>
            </td>
        </tr>

        <tr>
            <td><p>Permutation Index #n</p></td>
            <td>
                <p>This value is the index permutation used to map each
                    dimension from the canonical representation to an alternate axis
                    for each dimension. Currently, dimension permutations are not
                    supported, and these indices should be set to the index position
                    minus one. In other words, the first dimension should be set to 0,
                    the second dimension should be set to 1, and so on.</p>
            </td>
        </tr>

        <tr>
            <td><p>Base Type</p></td>
            <td>
                <p>Each array type is based on some parent type. The information
                    for that parent type is described recursively by this field.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="format">
        <caption>Array Property Description for Datatype Version 3</caption>

        <tr>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
            <th width="25%">Byte</th>
        </tr>

        <tr>
            <td>Dimensionality</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Dimension #1 Size</td>
        </tr>
        <tr>
            <td colspan="4">.<br />.<br />.<br /></td>
        </tr>
        <tr>
            <td colspan="4">Dimension #n Size</td>
        </tr>

        <tr>
            <td colspan="4"><br />Base Type<br />
            <br /></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Dimensionality</p></td>
            <td>
                <p>This value is the number of dimensions that the array has.</p>
            </td>
        </tr>

        <tr>
            <td><p>Dimension #n Size</p></td>
            <td>
                <p>This value is the size of the dimension of the array as
                    stored in the file. The first dimension stored in the list of
                    dimensions is the slowest changing dimension and the last dimension
                    stored is the fastest changing dimension.</p>
            </td>
        </tr>

        <tr>
            <td><p>Base Type</p></td>
            <td>
                <p>Each array type is based on some parent type. The information
                    for that parent type is described recursively by this field.</p>
            </td>
        </tr>

    </table>
</div>



<br />
<h4>
    <a name="OldFillValueMessage">IV.A.2.e. The Data Storage - Fill
        Value (Old) Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Fill Value (old)</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0004</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td><p>The fill value message stores a single data value
                    which is returned to the application when an uninitialized data
                    element is read from a dataset. The fill value is interpreted with
                    the same datatype as the dataset. If no fill value message is
                    present then a fill value of all zero bytes is assumed.</p>
                <p>This fill value message is deprecated in favor of the
                    &ldquo;new&rdquo; fill value message (Message Type 0x0005) and is
                    only written to the file for forward compatibility with versions of
                    the HDF5 Library before the 1.6.0 version. Additionally, it only
                    appears for datasets with a user-defined fill value (as opposed to
                    the library default fill value or an explicitly set
                    &ldquo;undefined&rdquo; fill value).</p></td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Fill Value Message (Old)</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td colspan="4">Size</td>
        </tr>

        <tr>
            <td colspan="4"><br />Fill Value <em>(optional, variable
                    size)</em><br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Size</p></td>
            <td>
                <p>This is the size of the Fill Value field in bytes.</p>
            </td>
        </tr>

        <tr>
            <td><p>Fill Value</p></td>
            <td>
                <p>The fill value. The bytes of the fill value are interpreted
                    using the same datatype as for the dataset.</p>
            </td>
        </tr>
    </table>
</div>


<br />
<h4>
    <a name="FillValueMessage">IV.A.2.f. The Data Storage - Fill Value
        Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Fill Value</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0005</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Required for dataset objects; may
                not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>The fill value message stores a single data value which is
                returned to the application when an uninitialized data element is
                read from a dataset. The fill value is interpreted with the same
                datatype as the dataset.</td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Fill Value Message - Versions 1 & 2</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Space Allocation Time</td>
            <td>Fill Value Write Time</td>
            <td>Fill Value Defined</td>
        </tr>

        <tr>
            <td colspan="4">Size <em>(optional)</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Fill Value <em>(optional, variable
                    size)</em><br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>The version number information is used for changes in the
                    format of the fill value message and is described here:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Version</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Never used</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Initial version of this message.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>In this version, the Size and Fill Value fields are only
                            present if the Fill Value Defined field is set to 1.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>This version packs the other fields in the message more
                            efficiently than version 2.</td>
                    </tr>
                </table>
                <p></p>
                <p></p>
            </td>
        </tr>

        <tr>
            <td><p>Space Allocation Time</p></td>
            <td>
                <p>When the storage space for the dataset&rsquo;s raw data will
                    be allocated. The allowed values are:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Not used.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Early allocation. Storage space for the entire dataset
                            should be allocated in the file when the dataset is created.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Late allocation. Storage space for the entire dataset
                            should not be allocated until the dataset is written to.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>Incremental allocation. Storage space for the dataset
                            should not be allocated until the portion of the dataset is
                            written to. This is currently used in conjunction with chunked
                            data storage for datasets.</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Fill Value Write Time</p></td>
            <td>
                <p>At the time that storage space for the dataset&rsquo;s raw
                    data is allocated, this value indicates whether the fill value
                    should be written to the raw data storage elements. The allowed
                    values are:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>On allocation. The fill value is always written to the
                            raw data storage when the storage space is allocated.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Never. The fill value should never be written to the raw
                            data storage.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Fill value written if set by user. The fill value will be
                            written to the raw data storage when the storage space is
                            allocated only if the user explicitly set the fill value. If the
                            fill value is the library default or is undefined, it will not be
                            written to the raw data storage.</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Fill Value Defined</p></td>
            <td>
                <p>This value indicates if a fill value is defined for this
                    dataset. If this value is 0, the fill value is undefined. If this
                    value is 1, a fill value is defined for this dataset. For version 2
                    or later of the fill value message, this value controls the
                    presence of the Size and Fill Value fields.</p>
            </td>
        </tr>

        <tr>
            <td><p>Size</p></td>
            <td>
                <p>This is the size of the Fill Value field in bytes. This field
                    is not present if the Version field is greater than 1, and the Fill
                    Value Defined field is set to 0.</p>
            </td>
        </tr>

        <tr>
            <td><p>Fill Value</p></td>
            <td>
                <p>The fill value. The bytes of the fill value are interpreted
                    using the same datatype as for the dataset. This field is not
                    present if the Version field is greater than 1, and the Fill Value
                    Defined field is set to 0.</p>
            </td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="format">
        <caption>Fill Value Message - Version 3</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Flags</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Size <em>(optional)</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Fill Value <em>(optional, variable
                    size)</em><br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>The version number information is used for changes in the
                    format of the fill value message and is described here:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Version</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Never used</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Initial version of this message.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>In this version, the Size and Fill Value fields are only
                            present if the Fill Value Defined field is set to 1.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>This version packs the other fields in the message more
                            efficiently than version 2.</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Flags</p></td>
            <td>
                <p>When the storage space for the dataset&rsquo;s raw data will
                    be allocated. The allowed values are:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bits</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0-1</code></td>
                        <td>Space Allocation Time, with the same values as versions 1
                            and 2 of the message.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>2-3</code></td>
                        <td>Fill Value Write Time, with the same values as versions 1
                            and 2 of the message.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>4</code></td>
                        <td>Fill Value Undefined, indicating that the fill value has
                            been marked as &ldquo;undefined&rdquo; for this dataset. Bits 4
                            and 5 cannot both be set.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>5</code></td>
                        <td>Fill Value Defined, with the same values as versions 1
                            and 2 of the message. Bits 4 and 5 cannot both be set.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>6-7</code></td>
                        <td>Reserved (zero).</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Size</p></td>
            <td>
                <p>This is the size of the Fill Value field in bytes. This field
                    is not present if the Version field is greater than 1, and the Fill
                    Value Defined flag is set to 0.</p>
            </td>
        </tr>

        <tr>
            <td><p>Fill Value</p></td>
            <td>
                <p>The fill value. The bytes of the fill value are interpreted
                    using the same datatype as for the dataset. This field is not
                    present if the Version field is greater than 1, and the Fill Value
                    Defined flag is set to 0.</p>
            </td>
        </tr>
    </table>
</div>


<br />
<h4>
    <a name="LinkMessage">IV.A.2.g. The Link Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Link</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0006</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td><p>This message encodes the information for a link in a
                    group&rsquo;s object header, when the group is storing its links
                    &ldquo;compactly&rdquo;, or in the group&rsquo;s fractal heap, when
                    the group is storing its links &ldquo;densely&rdquo;.</p>
                <p>
                    A group is storing its links compactly when the fractal heap
                    address in the <em><a href="#LinkInfoMessage">Link Info
                            Message</a></em> is set to the &ldquo;undefined address&rdquo; value.
                </p></td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Link Message</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Flags</td>
            <td>Link type <em>(optional)</em></td>
            <td bgcolor="#DDDDDD"><em>This space inserted only to align
                    table nicely</em></td>
        </tr>
        <tr>
            <td colspan="4"><br />Creation Order <em>(8 bytes,
                    optional)</em><br />
            <br /></td>
        </tr>
        <tr>
            <td>Link Name Character Set <em>(optional)</em></td>
            <td>Length of Link Name (variable size)</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>
        <tr>
            <td colspan="4">Link Name (variable size)</td>
        </tr>
        <tr>
            <td colspan="4"><br />Link Information (variable size)<br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number for this message. This document
                    describes version 1.</p></td>
        </tr>

        <tr>
            <td><p>Flags</p></td>
            <td><p>This field contains information about the link and
                    controls the presence of other fields below.</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bits</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0-1</code></td>
                        <td>Determines the size of the <em>Length of Link Name</em>
                            field.
                            <table class="list">
                                <tr>
                                    <th width="20%" align="center">Value</th>
                                    <th width="80%" align="left">Description</th>
                                </tr>

                                <tr>
                                    <td align="center"><code>0</code></td>
                                    <td>The size of the <em>Length of Link Name</em> field is
                                        1 byte.
                                    </td>
                                </tr>
                                <tr>
                                    <td align="center"><code>1</code></td>
                                    <td>The size of the <em>Length of Link Name</em> field is
                                        2 bytes.
                                    </td>
                                </tr>
                                <tr>
                                    <td align="center"><code>2</code></td>
                                    <td>The size of the <em>Length of Link Name</em> field is
                                        4 bytes.
                                    </td>
                                </tr>
                                <tr>
                                    <td align="center"><code>3</code></td>
                                    <td>The size of the <em>Length of Link Name</em> field is
                                        8 bytes.
                                    </td>
                                </tr>
                            </table>
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Creation Order Field Present: if set, the <em>Creation
                                Order</em> field is present. If not set, creation order information
                            is not stored for links in this group.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>Link Type Field Present: if set, the link is not a hard
                            link and the <em>Link Type</em> field is present. If not set, the
                            link is a hard link.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>4</code></td>
                        <td>Link Name Character Set Field Present: if set, the link
                            name is not represented with the ASCII character set and the <em>Link
                                Name Character Set</em> field is present. If not set, the link name
                            is represented with the ASCII character set.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>5-7</code></td>
                        <td>Reserved (zero).</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Link type</p></td>
            <td><p>This is the link class type and can be one of the
                    following values:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>A hard link (should never be stored in the file)</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>A soft link.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>2-63</code></td>
                        <td>Reserved for future HDF5 internal use.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>64</code></td>
                        <td>An external link.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>65-255</code></td>
                        <td>Reserved, but available for user-defined link types.</td>
                    </tr>
                </table>
                <p></p>

                <p>
                    This field is present if bit 3 of <em>Flags</em> is set.
                </p></td>
        </tr>

        <tr>
            <td><p>Creation Order</p></td>
            <td><p>This 64-bit value is an index of the link&rsquo;s
                    creation time within the group. Values start at 0 when the group is
                    created an increment by one for each link added to the group.
                    Removing a link from a group does not change existing links&rsquo;
                    creation order field.</p>
                <p>
                    This field is present if bit 2 of <em>Flags</em> is set.
                </p></td>
        </tr>

        <tr>
            <td><p>Link Name Character Set</p></td>
            <td><p>This is the character set for encoding the
                    link&rsquo;s name:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>ASCII character set encoding (this should never be stored
                            in the file)</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>UTF-8 character set encoding</td>
                    </tr>
                </table>
                <p></p>

                <p>
                    This field is present if bit 4 of <em>Flags</em> is set.
                </p></td>
        </tr>

        <tr>
            <td><p>Length of link name</p></td>
            <td><p>
                    This is the length of the link&rsquo;s name. The size of this field
                    depends on bits 0 and 1 of <em>Flags</em>.
                </p></td>
        </tr>

        <tr>
            <td><p>Link name</p></td>
            <td><p>This is the name of the link, non-NULL terminated.</p></td>
        </tr>

        <tr>
            <td><p>Link information</p></td>
            <td><p>
                    The format of this field depends on the <em>link type</em>.
                </p>
                <p>
                    For <b>hard</b> links, the field is formatted as follows:

                </p>
                <table class="list">
                    <tr>
                        <td width="20%"><i>Size of Offsets</i> bytes:</td>
                        <td width="80%">The address of the object header for the
                            object that the link points to.</td>
                    </tr>
                </table>
                <p></p>

                <p>
                    For <b>soft</b> links, the field is formatted as follows:

                </p>
                <table class="list">
                    <tr>
                        <td width="20%">Bytes 1-2:</td>
                        <td width="80%">Length of soft link value.</td>
                    </tr>
                    <tr>
                        <td><em>Length of soft link value</em> bytes:</td>
                        <td>A non-NULL-terminated string storing the value of the
                            soft link.</td>
                    </tr>
                </table>
                <p></p>

                <p>
                    For <b>external</b> links, the field is formatted as follows:

                </p>
                <table class="list">
                    <tr>
                        <td width="20%">Bytes 1-2:</td>
                        <td width="80%">Length of external link value.</td>
                    </tr>
                    <tr>
                        <td><em>Length of external link value</em> bytes:</td>
                        <td>The first byte contains the version number in the upper 4
                            bits and flags in the lower 4 bits for the external link. Both
                            version and flags are defined to be zero in this document. The
                            remaining bytes consist of two NULL-terminated strings, with no
                            padding between them. The first string is the name of the HDF5
                            file containing the object linked to and the second string is the
                            full path to the object linked to, within the HDF5 file&rsquo;s
                            group hierarchy.</td>
                    </tr>
                </table>
                <p></p>

                <p>
                    For <b>user-defined</b> links, the field is formatted as follows:

                </p>
                <table class="list">
                    <tr>
                        <td width="20%">Bytes 1-2:</td>
                        <td width="80%">Length of user-defined data.</td>
                    </tr>
                    <tr>
                        <td><em>Length of user-defined link value</em> bytes:</td>
                        <td>The data supplied for the user-defined link type.</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>
    </table>
</div>

<br />
<h4>
    <a name="ExternalFileListMessage">IV.A.2.h. The Data Storage -
        External Data Files Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> External Data Files</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0007</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>The external data storage message indicates that the data
                for an object is stored outside the HDF5 file. The filename of the
                object is stored as a Universal Resource Location (URL) of the
                actual filename containing the data. An external file list record
                also contains the byte offset of the start of the data within the
                file and the amount of space reserved in the file for that data.</td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>External File List Message</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td colspan="3">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="2">Allocated Slots</td>
            <td colspan="2">Used Slots</td>
        </tr>

        <tr>
            <td colspan="4"><br />Heap Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Slot Definitions...<br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>The version number information is used for changes in the
                    format of External Data Storage Message and is described here:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Version</th>
                        <th width="80%" align="left">Description</th>
                    </tr>
                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Never used.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>The current version used by the library.</td>
                    </tr>
                </table>
                <p></p>

            </td>
        </tr>

        <tr>
            <td><p>Allocated Slots</p></td>
            <td>
                <p>The total number of slots allocated in the message. Its value
                    must be at least as large as the value contained in the Used Slots
                    field. (The current library simply uses the number of Used Slots
                    for this message)</p>
            </td>
        </tr>

        <tr>
            <td><p>Used Slots</p></td>
            <td>
                <p>The number of initial slots which contains valid information.</p>
            </td>
        </tr>

        <tr>
            <td><p>Heap Address</p></td>
            <td>
                <p>This is the address of a local heap which contains the names
                    for the external files (The local heap information can be found in
                    Disk Format Level 1D in this document). The name at offset zero in
                    the heap is always the empty string.</p>
            </td>
        </tr>

        <tr>
            <td><p>Slot Definitions</p></td>
            <td>
                <p>The slot definitions are stored in order according to the
                    array addresses they represent.</p>
            </td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="format">
        <caption>External File List Slot</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Name Offset in Local Heap<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Offset in External Data File<sup>L</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Data Size in External File<sup>L</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;L&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Lengths&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Name Offset in Local Heap</p></td>
            <td>
                <p>
                    The byte offset within the local name heap for the name of the
                    file. File names are stored as a URL which has a protocol name, a
                    host name, a port number, and a file name:
                    <code>
                        <em>protocol</em>:<em>port</em>//<em>host</em>/<em>file</em>
                    </code>
                    . If the protocol is omitted then &ldquo;file:&rdquo; is assumed.
                    If the port number is omitted then a default port for that protocol
                    is used. If both the protocol and the port number are omitted then
                    the colon can also be omitted. If the double slash and host name
                    are omitted then &ldquo;localhost&rdquo; is assumed. The file name
                    is the only mandatory part, and if the leading slash is missing
                    then it is relative to the application&rsquo;s current working
                    directory (the use of relative names is not recommended).
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Offset in External Data File</p></td>
            <td>
                <p>This is the byte offset to the start of the data in the
                    specified file. For files that contain data for a single dataset
                    this will usually be zero.</p>
            </td>
        </tr>

        <tr>
            <td><p>Data Size in External File</p></td>
            <td>
                <p>This is the total number of bytes reserved in the specified
                    file for raw data storage. For a file that contains exactly one
                    complete dataset which is not extendable, the size will usually be
                    the exact size of the dataset. However, by making the size larger
                    one allows HDF5 to extend the dataset. The size can be set to a
                    value larger than the entire file since HDF5 will read zeroes past
                    the end of the file without failing.</p>
            </td>
        </tr>
    </table>
</div>


<br />
<h4>
    <a name="LayoutMessage">IV.A.2.i. The Data Storage - Layout Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Data Storage -
                Layout</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0008</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Required for datasets; may not be
                repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>Data layout describes how the elements of a
                multi-dimensional array are stored in the HDF5 file. Three types of
                data layout are supported:
                <ol>
                    <li>Contiguous: The array is stored in one contiguous area of
                        the file. This layout requires that the size of the array be
                        constant: data manipulations such as chunking, compression,
                        checksums, or encryption are not permitted. The message stores the
                        total storage size of the array. The offset of an element from the
                        beginning of the storage area is computed as in a C array.</li>
                    <li>Chunked: The array domain is regularly decomposed into
                        chunks, and each chunk is allocated and stored separately. This
                        layout supports arbitrary element traversals, compression,
                        encryption, and checksums. (these features are described in other
                        messages). The message stores the size of a chunk instead of the
                        size of the entire array; the storage size of the entire array can
                        be calculated by traversing the B-tree that stores the chunk
                        addresses.</li>
                    <li>Compact: The array is stored in one contiguous block, as
                        part of this object header message.</li>
                </ol>
            </td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Data Layout Message (Versions 1 and 2)</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Dimensionality</td>
            <td>Layout Class</td>
            <td>Reserved <em>(zero)</em></td>
        </tr>

        <tr>
            <td colspan="4">Reserved <em>(zero)</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Data Address<sup>O</sup> <em>(optional)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Dimension 0 Size</td>
        </tr>

        <tr>
            <td colspan="4">Dimension 1 Size</td>
        </tr>

        <tr>
            <td colspan="4">...</td>
        </tr>

        <tr>
            <td colspan="4">Dimension #n Size</td>
        </tr>

        <tr>
            <td colspan="4">Dataset Element Size <em>(optional)</em></td>
        </tr>

        <tr>
            <td colspan="4">Compact Data Size <em>(optional)</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Compact Data... <em>(variable size,
                    optional)</em><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>The version number information is used for changes in the
                    format of the data layout message and is described here:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Version</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Never used.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Used by version 1.4 and before of the library to encode
                            layout information. Data space is always allocated when the data
                            set is created.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Used by version 1.6.x of the library to encode layout
                            information. Data space is allocated only when it is necessary.</td>
                    </tr>
                </table>
                <p></p>
            </td>
        </tr>

        <tr>
            <td><p>Dimensionality</p></td>
            <td><p>An array has a fixed dimensionality. This field
                    specifies the number of dimension size fields later in the message.
                    The value stored for chunked storage is 1 greater than the number
                    of dimensions in the dataset&rsquo;s dataspace. For example, 2 is
                    stored for a 1 dimensional dataset.</p></td>
        </tr>

        <tr>
            <td><p>Layout Class</p></td>
            <td><p>The layout class specifies the type of storage for
                    the data and how the other fields of the layout message are to be
                    interpreted.</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Compact Storage</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Contiguous Storage</td>
                    </tr>

                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Chunked Storage</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Data Address</p></td>
            <td><p>For contiguous storage, this is the address of the
                    raw data in the file. For chunked storage this is the address of
                    the v1 B-tree that is used to look up the addresses of the chunks.
                    This field is not present for compact storage. If the version for
                    this message is greater than 1, the address may have the
                    &ldquo;undefined address&rdquo; value, to indicate that storage has
                    not yet been allocated for this array.</p></td>
        </tr>

        <tr>
            <td><p>Dimension #n Size</p></td>
            <td><p>For contiguous and compact storage the dimensions
                    define the entire size of the array while for chunked storage they
                    define the size of a single chunk. In all cases, they are in units
                    of array elements (not bytes). The first dimension stored in the
                    list of dimensions is the slowest changing dimension and the last
                    dimension stored is the fastest changing dimension.</p></td>
        </tr>

        <tr>
            <td><p>Dataset Element Size</p></td>
            <td><p>The size of a dataset element, in bytes. This field
                    is only present for chunked storage.</p></td>
        </tr>

        <tr>
            <td><p>Compact Data Size</p></td>
            <td><p>This field is only present for compact data storage.
                    It contains the size of the raw data for the dataset array, in
                    bytes.</p></td>
        </tr>

        <tr>
            <td><p>Compact Data</p></td>
            <td><p>This field is only present for compact data storage.
                    It contains the raw data for the dataset array.</p></td>
        </tr>
    </table>
</div>

<br />
<p>Version 3 of this message re-structured the format into specific
    properties that are required for each layout class.</p>


<div align="center">
    <table class="format">
        <caption>
            <b>Data Layout Message (Version 3)</b>
        </caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Layout Class</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Properties <em>(variable size)</em><br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td>
                <p>The version number information is used for changes in the
                    format of layout message and is described here:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Version</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>Used by the version 1.6.3 and later of the library to
                            store properties for each layout class.</td>
                    </tr>
                </table>
                <p></p>
            </td>
        </tr>

        <tr>
            <td><p>Layout Class</p></td>
            <td><p>The layout class specifies the type of storage for
                    the data and how the other fields of the layout message are to be
                    interpreted.</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Compact Storage</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Contiguous Storage</td>
                    </tr>

                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Chunked Storage</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Properties</p></td>
            <td><p>This variable-sized field encodes information
                    specific to each layout class and is described below. If there is
                    no property information specified for a layout class, the size of
                    this field is zero bytes.</p></td>
        </tr>
    </table>
</div>

<br />
<p>Class-specific information for compact layout (Class 0): (Note:
    The dimensionality information is in the Dataspace message)</p>


<div align="center">
    <table class="format">
        <caption>Compact Storage Property Description</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td colspan="2">Size</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Raw Data... <em>(variable size)</em><br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Size</p></td>
            <td><p>This field contains the size of the raw data for the
                    dataset array, in bytes.</p></td>
        </tr>

        <tr>
            <td><p>Raw Data</p></td>
            <td><p>This field contains the raw data for the dataset
                    array.</p></td>
        </tr>
    </table>
</div>


<br />
<p>Class-specific information for contiguous layout (Class 1):
    (Note: The dimensionality information is in the Dataspace message)</p>


<div align="center">
    <table class="format">
        <caption>Contiguous Storage Property Description</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Size<sup>L</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Address</p></td>
            <td><p>This is the address of the raw data in the file. The
                    address may have the &ldquo;undefined address&rdquo; value, to
                    indicate that storage has not yet been allocated for this array.</p></td>
        </tr>

        <tr>
            <td><p>Size</p></td>
            <td><p>This field contains the size allocated to store the
                    raw data, in bytes.</p></td>
        </tr>
    </table>
</div>


<br />
<p>Class-specific information for chunked layout (Class 2):</p>


<div align="center">
    <table class="format">
        <caption>Chunked Storage Property Description</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Dimensionality</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Dimension 0 Size</td>
        </tr>

        <tr>
            <td colspan="4">Dimension 1 Size</td>
        </tr>

        <tr>
            <td colspan="4">...</td>
        </tr>

        <tr>
            <td colspan="4">Dimension #n Size</td>
        </tr>

        <tr>
            <td colspan="4">Dataset Element Size</td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Dimensionality</p></td>
            <td><p>A chunk has a fixed dimensionality. This field
                    specifies the number of dimension size fields later in the message.</p></td>
        </tr>

        <tr>
            <td><p>Address</p></td>
            <td><p>This is the address of the v1 B-tree that is used to
                    look up the addresses of the chunks that actually store portions of
                    the array data. The address may have the &ldquo;undefined
                    address&rdquo; value, to indicate that storage has not yet been
                    allocated for this array.</p></td>
        </tr>

        <tr>
            <td><p>Dimension #n Size</p></td>
            <td><p>These values define the dimension size of a single
                    chunk, in units of array elements (not bytes). The first dimension
                    stored in the list of dimensions is the slowest changing dimension
                    and the last dimension stored is the fastest changing dimension.</p></td>
        </tr>

        <tr>
            <td><p>Dataset Element Size</p></td>
            <td><p>The size of a dataset element, in bytes.</p></td>
        </tr>
    </table>
</div>

<br />
<h4>
    <a name="BogusMessage">IV.A.2.j. The Bogus Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Bogus</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0009</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> 4 bytes</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> For testing only; should never be
                stored in a valid file.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>This message is used for testing the HDF5 Library&rsquo;s
                response to an &ldquo;unknown&rdquo; message type and should never
                be encountered in a valid HDF5 file.</td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Bogus Message</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td colspan="4">Bogus Value</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Bogus Value</p></td>
            <td>
                <p>
                    This value should always be:
                    <code>0xdeadbeef</code>
                    .
                </p>
            </td>
        </tr>
    </table>
</div>

<br />
<h4>
    <a name="GroupInfoMessage">IV.A.2.k. The Group Info Message </a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Group Info</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x000A</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td><p>
                    This message stores information for the constants defining a
                    &ldquo;new style&rdquo; group&rsquo;s behavior. Constant
                    information will be stored in this message and variable information
                    will be stored in the <a href="#LinkInfoMessage">Link Info</a>
                    message.
                </p>
                <p>Note: the &ldquo;estimated entry&rdquo; information below is
                    used when determining the size of the object header for the group
                    when it is created.</p></td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Group Info Message</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Flags</td>
            <td colspan="2">Link Phase Change: Maximum Compact Value <em>(optional)</em></td>
        </tr>
        <tr>
            <td colspan="2">Link Phase Change: Minimum Dense Value <em>(optional)</em></td>
            <td colspan="2">Estimated Number of Entries <em>(optional)</em></td>
        </tr>
        <tr>
            <td colspan="2">Estimated Link Name Length of Entries <em>(optional)</em></td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number for this message. This document
                    describes version 0.</p></td>
        </tr>

        <tr>
            <td><p>Flags</p></td>
            <td><p>This is the group information flag with the following
                    definition:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>If set, link phase change values are stored.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>If set, the estimated entry information is non-default
                            and is stored.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>2-7</code></td>
                        <td>Reserved</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Link Phase Change: Maximum Compact Value</p></td>
            <td><p>The is the maximum number of links to store
                    &ldquo;compactly&rdquo; (in the group&rsquo;s object header).</p>
                <p>
                    This field is present if bit 0 of <em>Flags</em> is set.
                </p></td>
        </tr>

        <tr>
            <td><p>Link Phase Change: Minimum Dense Value</p></td>
            <td><p>
                    This is the minimum number of links to store &ldquo;densely&rdquo;
                    (in the group&rsquo;s fractal heap). The fractal heap&rsquo;s
                    address is located in the <a href="#LinkInfoMessage">Link Info</a>
                    message.
                </p>
                <p>
                    This field is present if bit 0 of <em>Flags</em> is set.
                </p></td>
        </tr>

        <tr>
            <td><p>Estimated Number of Entries</p></td>
            <td><p>This is the estimated number of entries in groups.</p>
                <p>
                    If this field is not present, the default value of
                    <code>4</code>
                    will be used for the estimated number of group entries.
                </p>
                <p>
                    This field is present if bit 1 of <em>Flags</em> is set.
                </p></td>
        </tr>

        <tr>
            <td><p>Estimated Link Name Length of Entries</p></td>
            <td><p>This is the estimated length of entry name.</p>
                <p>
                    If this field is not present, the default value of
                    <code>8</code>
                    will be used for the estimated link name length of group entries.
                </p>
                <p>
                    This field is present if bit 1 of <em>Flags</em> is set.
                </p></td>
        </tr>

    </table>
</div>
<p></p>

<br />
<h4>
    <a name="FilterMessage">IV.A.2.l. The Data Storage - Filter
        Pipeline Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Data Storage -
                Filter Pipeline</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x000B</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td><p>This message describes the filter pipeline which
                    should be applied to the data stream by providing filter
                    identification numbers, flags, a name, and client data.</p>
                <p>This message may be present in the object headers of both
                    dataset and group objects. For datasets, it specifies the filters
                    to apply to raw data. For groups, it specifies the filters to apply
                    to the group&rsquo;s fractal heap. Currently, only datasets using
                    chunked data storage use the filter pipeline on their raw data.</p></td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Filter Pipeline Message - Version 1</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Number of Filters</td>
            <td colspan="2">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4"><br />Filter Description List <em>(variable
                    size)</em><br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number for this message. This table
                    describes version 1.</p></td>
        </tr>

        <tr>
            <td><p>Number of Filters</p></td>
            <td><p>The total number of filters described in this
                    message. The maximum possible number of filters in a message is 32.</p></td>
        </tr>

        <tr>
            <td><p>Filter Description List</p></td>
            <td><p>A description of each filter. A filter description
                    appears in the next table.</p></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="format">
        <caption>Filter Description</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td colspan="2">Filter Identification Value</td>
            <td colspan="2">Name Length</td>
        </tr>

        <tr>
            <td colspan="2">Flags</td>
            <td colspan="2">Number Client Data Values</td>
        </tr>

        <tr>
            <td colspan="4"><br />Name <em>(variable size, optional)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Client Data <em>(variable size,
                    optional)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Padding <em>(variable size, optional)</em></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Filter Identification Value</p></td>
            <td>
                <p>
                    This value, often referred to as a filter identifier, is designed
                    to be a unique identifier for the filter. Values from zero through
                    32,767 are reserved for filters supported by The HDF Group in the
                    HDF5 Library and for filters requested and supported by third
                    parties. Filters supported by The HDF Group are documented
                    immediately below. Information on 3rd-party filters can be found at
                    The HDF Group&rsquo;s <a href="https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md">
                    Registered Filters</a> page.
                </p>

                <p>
                    To request a filter identifier, please contact The HDF
                    Group&rsquo;s Help Desk at <img src="Graphics/help.png"
                        valign="middle" height="14" alt="The HDF Group Help Desk">.
                    You will be asked to provide the following information:
                </p>
                <ol>
                    <li>Contact information for the developer requesting the new
                        identifier</li>
                    <li>A short description of the new filter</li>
                    <li>Links to any relevant information, including licensing
                        information</li>
                </ol>
                <p>Values from 32768 to 65535 are reserved for non-distributed
                    uses (for example, internal company usage) or for application usage
                    when testing a feature. The HDF Group does not track or document
                    the use of the filters with identifiers from this range.</p>

                <p>The filters currently in library version 1.8.0 are listed
                    below:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Identification</th>
                        <th width="15%" align="left">Name</th>
                        <th width="65%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>N/A</td>
                        <td>Reserved</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>deflate</td>
                        <td>GZIP deflate compression</td>
                    </tr>

                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>shuffle</td>
                        <td>Data element shuffling</td>
                    </tr>

                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>fletcher32</td>
                        <td>Fletcher32 checksum</td>
                    </tr>

                    <tr>
                        <td align="center"><code>4</code></td>
                        <td>szip</td>
                        <td>SZIP compression</td>
                    </tr>

                    <tr>
                        <td align="center"><code>5</code></td>
                        <td>nbit</td>
                        <td>N-bit packing</td>
                    </tr>

                    <tr>
                        <td align="center"><code>6</code></td>
                        <td>scaleoffset</td>
                        <td>Scale and offset encoded values</td>
                    </tr>
                </table>
                <p></p>
            </td>
        </tr>

        <tr>
            <td><p>Name Length</p></td>
            <td><p>Each filter has an optional null-terminated ASCII
                    name and this field holds the length of the name including the null
                    termination padded with nulls to be a multiple of eight. If the
                    filter has no name then a value of zero is stored in this field.</p></td>
        </tr>

        <tr>
            <td><p>Flags</p></td>
            <td><p>The flags indicate certain properties for a filter.
                    The bit values defined so far are:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>If set then the filter is an optional filter. During
                            output, if an optional filter fails it will be silently skipped
                            in the pipeline.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1-15</code></td>
                        <td>Reserved (zero)</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Number of Client Data Values</p></td>
            <td><p>
                    Each filter can store integer values to control how the filter
                    operates. The number of entries in the <em>Client Data</em> array
                    is stored in this field.
                </p></td>
        </tr>

        <tr>
            <td><p>Name</p></td>
            <td><p>
                    If the <em>Name Length</em> field is non-zero then it will contain
                    the size of this field, padded to a multiple of eight. This field
                    contains a null-terminated, ASCII character string to serve as a
                    comment/name for the filter.
                </p></td>
        </tr>

        <tr>
            <td><p>Client Data</p></td>
            <td><p>
                    This is an array of four-byte integers which will be passed to the
                    filter function. The <em>Client Data Number</em> of Values
                    determines the number of elements in the array.
                </p></td>
        </tr>

        <tr>
            <td><p>Padding</p></td>
            <td><p>Four bytes of zeroes are added to the message at this
                    point if the Client Data Number of Values field contains an odd
                    number.</p></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="format">
        <caption>Filter Pipeline Message - Version 2</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Number of Filters</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Filter Description List <em>(variable
                    size)</em><br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number for this message. This table
                    describes version 2.</p></td>
        </tr>

        <tr>
            <td><p>Number of Filters</p></td>
            <td><p>The total number of filters described in this
                    message. The maximum possible number of filters in a message is 32.</p></td>
        </tr>

        <tr>
            <td><p>Filter Description List</p></td>
            <td><p>A description of each filter. A filter description
                    appears in the next table.</p></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="format">
        <caption>Filter Description</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td colspan="2">Filter Identification Value</td>
            <td colspan="2">Name Length <em>(optional)</em></td>
        </tr>

        <tr>
            <td colspan="2">Flags</td>
            <td colspan="2">Number Client Data Values</td>
        </tr>

        <tr>
            <td colspan="4"><br />Name <em>(variable size, optional)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Client Data <em>(variable size,
                    optional)</em><br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Filter Identification Value</p></td>
            <td>
                <p>
                    This value, often referred to as a filter identifier, is designed
                    to be a unique identifier for the filter. Values from zero through
                    32,767 are reserved for filters supported by The HDF Group in the
                    HDF5 Library and for filters requested and supported by third
                    parties. Filters supported by The HDF Group are documented
                    immediately below. Information on 3rd-party filters can be found at
                    The HDF Group&rsquo;s <a href="https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md">
                    Registered Filters</a> page.
                </p>

                <p>
                    To request a filter identifier, please contact The HDF
                    Group&rsquo;s Help Desk at <img src="Graphics/help.png"
                        valign="middle" height="14" alt="The HDF Group Help Desk">.
                    You will be asked to provide the following information:
                </p>
                <ol>
                    <li>Contact information for the developer requesting the new
                        identifier</li>
                    <li>A short description of the new filter</li>
                    <li>Links to any relevant information, including licensing
                        information</li>
                </ol>
                <p>Values from 32768 to 65535 are reserved for non-distributed
                    uses (for example, internal company usage) or for application usage
                    when testing a feature. The HDF Group does not track or document
                    the use of the filters with identifiers from this range.</p>

                <p>The filters currently in library version 1.8.0 are listed
                    below:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Identification</th>
                        <th width="15%" align="left">Name</th>
                        <th width="65%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>N/A</td>
                        <td>Reserved</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>deflate</td>
                        <td>GZIP deflate compression</td>
                    </tr>

                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>shuffle</td>
                        <td>Data element shuffling</td>
                    </tr>

                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>fletcher32</td>
                        <td>Fletcher32 checksum</td>
                    </tr>

                    <tr>
                        <td align="center"><code>4</code></td>
                        <td>szip</td>
                        <td>SZIP compression</td>
                    </tr>

                    <tr>
                        <td align="center"><code>5</code></td>
                        <td>nbit</td>
                        <td>N-bit packing</td>
                    </tr>

                    <tr>
                        <td align="center"><code>6</code></td>
                        <td>scaleoffset</td>
                        <td>Scale and offset encoded values</td>
                    </tr>
                </table>
                <p></p>
            </td>
        </tr>

        <tr>
            <td><p>Name Length</p></td>
            <td><p>Each filter has an optional null-terminated ASCII
                    name and this field holds the length of the name including the null
                    termination padded with nulls to be a multiple of eight. If the
                    filter has no name then a value of zero is stored in this field.</p>
                <p>
                    Filters with IDs less than 256 (in other words, filters that are
                    defined in this format documentation) do not store the <em>Name
                        Length</em> or <em>Name</em> fields.
                </p></td>
        </tr>

        <tr>
            <td><p>Flags</p></td>
            <td><p>The flags indicate certain properties for a filter.
                    The bit values defined so far are:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>If set then the filter is an optional filter. During
                            output, if an optional filter fails it will be silently skipped
                            in the pipeline.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1-15</code></td>
                        <td>Reserved (zero)</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Number of Client Data Values</p></td>
            <td><p>
                    Each filter can store integer values to control how the filter
                    operates. The number of entries in the <em>Client Data</em> array
                    is stored in this field.
                </p></td>
        </tr>

        <tr>
            <td><p>Name</p></td>
            <td><p>
                    If the <em>Name Length</em> field is non-zero then it will contain
                    the size of this field, <em>not</em> padded to a multiple of eight.
                    This field contains a <em>non-</em>null-terminated, ASCII character
                    string to serve as a comment/name for the filter.
                </p>
                <p>
                    Filters that are defined in this format documentation such as
                    deflate and shuffle do not store the <em>Name Length</em> or <em>Name</em>
                    fields.
                </p></td>
        </tr>

        <tr>
            <td><p>Client Data</p></td>
            <td><p>
                    This is an array of four-byte integers which will be passed to the
                    filter function. The Client Data Number of Values<em></em>
                    determines the number of elements in the array.
                </p></td>
        </tr>
    </table>
</div>

<br />
<h4>
    <a name="AttributeMessage">IV.A.2.m. The Attribute Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Attribute</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x000C</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td><p>
                    The <em>Attribute</em> message is used to store objects in the HDF5
                    file which are used as attributes, or &ldquo;metadata&rdquo; about
                    the current object. An attribute is a small dataset; it has a name,
                    a datatype, a dataspace, and raw data. Since attributes are stored
                    in the object header, they should be relatively small (in other
                    words, less than 64KB). They can be associated with any type of
                    object which has an object header (groups, datasets, or committed
                    (named) datatypes).
                </p>
                <p>
                    In 1.8.x versions of the library, attributes can be larger than
                    64KB. See the <a
                        href="UG/HDF5_Users_Guide-Responsive%20HTML5/index.html#t=HDF5_User_Guide%2FAttributes%2FHDF5_Attributes.htm%3Frhtocid%3Dtoc8.2_1%23TOC_8_5_Special_Issuesbc-13">
                        &ldquo;Special Issues&rdquo;</a> section of the Attributes chapter in
                    the <cite>HDF5 User Guide</cite> for more information.
                </p>
                <p>Note: Attributes on an object must have unique names: the
                    HDF5 Library currently enforces this by causing the creation of an
                    attribute with a duplicate name to fail. Attributes on different
                    objects may have the same name, however.</p></td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Attribute Message (Version 1)</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Reserved (zero)</td>
            <td colspan="2">Name Size</td>
        </tr>

        <tr>
            <td colspan="2">Datatype Size</td>
            <td colspan="2">Dataspace Size</td>
        </tr>

        <tr>
            <td colspan="4"><br />Name <em>(variable size)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Datatype <em>(variable size)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Dataspace <em>(variable size)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Data <em>(variable size)</em><br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number information is used for changes in
                    the format of the attribute message and is described here:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Version</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Never used.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Used by the library before version 1.6 to encode
                            attribute message. This version does not support shared
                            datatypes.</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Name Size</p></td>
            <td><p>
                    The length of the attribute name in bytes including the null
                    terminator. Note that the <em>Name</em> field below may contain
                    additional padding not represented by this field.
                </p></td>
        </tr>

        <tr>
            <td><p>Datatype Size</p></td>
            <td><p>
                    The length of the datatype description in the <em>Datatype</em>
                    field below. Note that the <em>Datatype</em> field may contain
                    additional padding not represented by this field.
                </p></td>
        </tr>

        <tr>
            <td><p>Dataspace Size</p></td>
            <td><p>
                    The length of the dataspace description in the <em>Dataspace</em>
                    field below. Note that the <em>Dataspace</em> field may contain
                    additional padding not represented by this field.
                </p></td>
        </tr>

        <tr>
            <td><p>Name</p></td>
            <td><p>The null-terminated attribute name. This field is
                    padded with additional null characters to make it a multiple of
                    eight bytes.</p></td>
        </tr>

        <tr>
            <td><p>Datatype</p></td>
            <td><p>The datatype description follows the same format as
                    described for the datatype object header message. This field is
                    padded with additional zero bytes to make it a multiple of eight
                    bytes.</p></td>
        </tr>

        <tr>
            <td><p>Dataspace</p></td>
            <td><p>The dataspace description follows the same format as
                    described for the dataspace object header message. This field is
                    padded with additional zero bytes to make it a multiple of eight
                    bytes.</p></td>
        </tr>

        <tr>
            <td><p>Data</p></td>
            <td><p>
                    The raw data for the attribute. The size is determined from the
                    datatype and dataspace descriptions. This field is <em>not</em>
                    padded with additional bytes.
                </p></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="format">
        <caption>Attribute Message (Version 2)</caption>

        <tr align="center">
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Flags</td>
            <td colspan="2">Name Size</td>
        </tr>

        <tr>
            <td colspan="2">Datatype Size</td>
            <td colspan="2">Dataspace Size</td>
        </tr>

        <tr>
            <td colspan="4"><br />Name <em>(variable size)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Datatype <em>(variable size)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Dataspace <em>(variable size)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Data <em>(variable size)</em><br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number information is used for changes in
                    the format of the attribute message and is described here:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Version</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>Used by the library of version 1.6.x and after to encode
                            attribute messages. This version supports shared datatypes. The
                            fields of name, datatype, and dataspace are not padded with
                            additional bytes of zero.</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Flags</p></td>
            <td><p>This bit field contains extra information about
                    interpreting the attribute message:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>If set, datatype is shared.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>If set, dataspace is shared.</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Name Size</p></td>
            <td><p>The length of the attribute name in bytes including
                    the null terminator.</p></td>
        </tr>

        <tr>
            <td><p>Datatype Size</p></td>
            <td><p>
                    The length of the datatype description in the <em>Datatype</em>
                    field below.
                </p></td>
        </tr>

        <tr>
            <td><p>Dataspace Size</p></td>
            <td><p>
                    The length of the dataspace description in the <em>Dataspace</em>
                    field below.
                </p></td>
        </tr>

        <tr>
            <td><p>Name</p></td>
            <td><p>
                    The null-terminated attribute name. This field is <em>not</em>
                    padded with additional bytes.
                </p></td>
        </tr>

        <tr>
            <td><p>Datatype</p></td>
            <td><p>The datatype description follows the same format as
                    described for the datatype object header message.</p>
                <p>
                    If the <em>Flag</em> field indicates this attribute&rsquo;s
                    datatype is shared, this field will contain a &ldquo;shared
                    message&rdquo; encoding instead of the datatype encoding.
                </p>
                <p>
                    This field is <em>not</em> padded with additional bytes.
                </p></td>
        </tr>

        <tr>
            <td><p>Dataspace</p></td>
            <td><p>The dataspace description follows the same format as
                    described for the dataspace object header message.</p>
                <p>
                    If the <em>Flag</em> field indicates this attribute&rsquo;s
                    dataspace is shared, this field will contain a &ldquo;shared
                    message&rdquo; encoding instead of the dataspace encoding.
                </p>
                <p>
                    This field is <em>not</em> padded with additional bytes.
                </p></td>
        </tr>

        <tr>
            <td><p>Data</p></td>
            <td><p>The raw data for the attribute. The size is
                    determined from the datatype and dataspace descriptions.</p>
                <p>
                    This field is <em>not</em> padded with additional zero bytes.
                </p></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="format">
        <caption>Attribute Message (Version 3)</caption>

        <tr align="center">
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Flags</td>
            <td colspan="2">Name Size</td>
        </tr>

        <tr>
            <td colspan="2">Datatype Size</td>
            <td colspan="2">Dataspace Size</td>
        </tr>

        <tr>
            <td>Name Character Set Encoding</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Name <em>(variable size)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Datatype <em>(variable size)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Dataspace <em>(variable size)</em><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Data <em>(variable size)</em><br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number information is used for changes in
                    the format of the attribute message and is described here:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Version</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>Used by the library of version 1.8.x and after to encode
                            attribute messages. This version supports attributes with
                            non-ASCII names.</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Flags</p></td>
            <td><p>This bit field contains extra information about
                    interpreting the attribute message:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>If set, datatype is shared.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>If set, dataspace is shared.</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Name Size</p></td>
            <td><p>The length of the attribute name in bytes including
                    the null terminator.</p></td>
        </tr>

        <tr>
            <td><p>Datatype Size</p></td>
            <td><p>
                    The length of the datatype description in the <em>Datatype</em>
                    field below.
                </p></td>
        </tr>

        <tr>
            <td><p>Dataspace Size</p></td>
            <td><p>
                    The length of the dataspace description in the <em>Dataspace</em>
                    field below.
                </p></td>
        </tr>

        <tr>
            <td><p>Name Character Set Encoding</p></td>
            <td><p>The character set encoding for the attribute&rsquo;s
                    name:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>ASCII character set encoding</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>UTF-8 character set encoding</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Name</p></td>
            <td><p>
                    The null-terminated attribute name. This field is <em>not</em>
                    padded with additional bytes.
                </p></td>
        </tr>

        <tr>
            <td><p>Datatype</p></td>
            <td><p>The datatype description follows the same format as
                    described for the datatype object header message.</p>
                <p>
                    If the <em>Flag</em> field indicates this attribute&rsquo;s
                    datatype is shared, this field will contain a &ldquo;shared
                    message&rdquo; encoding instead of the datatype encoding.
                </p>
                <p>
                    This field is <em>not</em> padded with additional bytes.
                </p></td>
        </tr>

        <tr>
            <td><p>Dataspace</p></td>
            <td><p>The dataspace description follows the same format as
                    described for the dataspace object header message.</p>
                <p>
                    If the <em>Flag</em> field indicates this attribute&rsquo;s
                    dataspace is shared, this field will contain a &ldquo;shared
                    message&rdquo; encoding instead of the dataspace encoding.
                </p>
                <p>
                    This field is <em>not</em> padded with additional bytes.
                </p></td>
        </tr>

        <tr>
            <td><p>Data</p></td>
            <td><p>The raw data for the attribute. The size is
                    determined from the datatype and dataspace descriptions.</p>
                <p>
                    This field is <em>not</em> padded with additional zero bytes.
                </p></td>
        </tr>
    </table>
</div>

<br />
<h4>
    <a name="CommentMessage">IV.A.2.n. The Object Comment Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Object Comment</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x000D</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>The object comment is designed to be a short description of
                an object. An object comment is a sequence of non-zero (<code>\0</code>)
                ASCII characters with no other formatting included by the library.
            </td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Name Message</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Comment <em>(variable size)</em><br />
            <br /></td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Name</p></td>
            <td><p>A null terminated ASCII character string.</p></td>
        </tr>
    </table>
</div>

<br />
<h4>
    <a name="OldModificationTimeMessage">IV.A.2.o. The Object
        Modification Time (Old) Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Object Modification
                Time (Old)</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x000E</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Fixed</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td><p>The object modification date and time is a timestamp
                    which indicates (using ISO-8601 date and time format) the last
                    modification of an object. The time is updated when any object
                    header message changes according to the system clock where the
                    change was posted. All fields of this message should be interpreted
                    as coordinated universal time (UTC).</p>
                <p>
                    This modification time message is deprecated in favor of the
                    &ldquo;new&rdquo; <a href="#ModificationTimeMessage">Object
                        Modification Time</a> message and is no longer written to the file in
                    versions of the HDF5 Library after the 1.6.0 version.
                </p></td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Modification Time Message</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td colspan="4">Year</td>
        </tr>

        <tr>
            <td colspan="2">Month</td>
            <td colspan="2">Day of Month</td>
        </tr>

        <tr>
            <td colspan="2">Hour</td>
            <td colspan="2">Minute</td>
        </tr>

        <tr>
            <td colspan="2">Second</td>
            <td colspan="2">Reserved</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Year</p></td>
            <td><p>
                    The four-digit year as an ASCII string. For example,
                    <code>1998</code>
                    .
                </p></td>
        </tr>

        <tr>
            <td><p>Month</p></td>
            <td><p>
                    The month number as a two digit ASCII string where January is
                    <code>01</code>
                    and December is
                    <code>12</code>
                    .
                </p></td>
        </tr>

        <tr>
            <td><p>Day of Month</p></td>
            <td><p>
                    The day number within the month as a two digit ASCII string. The
                    first day of the month is
                    <code>01</code>
                    .
                </p></td>
        </tr>

        <tr>
            <td><p>Hour</p></td>
            <td><p>
                    The hour of the day as a two digit ASCII string where midnight is
                    <code>00</code>
                    and 11:00pm is
                    <code>23</code>
                    .
                </p></td>
        </tr>

        <tr>
            <td><p>Minute</p></td>
            <td><p>
                    The minute of the hour as a two digit ASCII string where the first
                    minute of the hour is
                    <code>00</code>
                    and the last is
                    <code>59</code>
                    .
                </p></td>
        </tr>

        <tr>
            <td><p>Second</p></td>
            <td><p>
                    The second of the minute as a two digit ASCII string where the
                    first second of the minute is
                    <code>00</code>
                    and the last is
                    <code>59</code>
                    .
                </p></td>
        </tr>

        <tr>
            <td><p>Reserved</p></td>
            <td><p>This field is reserved and should always be zero.</p></td>
        </tr>
    </table>
</div>

<br />
<h4>
    <a name="SOHMTableMessage">IV.A.2.p. The Shared Message Table
        Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Shared Message Table</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x000F</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Fixed</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>This message is used to locate the table of shared object
                header message (SOHM) indexes. Each index consists of information to
                find the shared messages from either the heap or object header. This
                message is <em>only</em> found in the superblock extension.
            </td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Shared Message Table Message</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Shared Object Header Message Table
                Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td>Number of Indices</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number for this message. This document
                    describes version 0.</p></td>
        </tr>

        <tr>
            <td><p>Shared Object Header Message Table Address</p></td>
            <td><p>This field is the address of the master table for
                    shared object header message indexes.</p></td>
        </tr>

        <tr>
            <td><p>Number of Indices</p></td>
            <td><p>This field is the number of indices in the master
                    table.</p></td>
        </tr>

    </table>
</div>

<br />
<h4>
    <a name="ContinuationMessage">IV.A.2.q. The Object Header
        Continuation Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Object Header
                Continuation</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0010</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Fixed</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>The object header continuation is the location in the file
                of a block containing more header messages for the current data
                object. This can be used when header blocks become too large or are
                likely to change over time.</td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Object Header Continuation Message</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />Offset<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Length<sup>L</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Offset</p></td>
            <td><p>This value is the address in the file where the
                    header continuation block is located.</p></td>
        </tr>

        <tr>
            <td><p>Length</p></td>
            <td><p>This value is the length in bytes of the header
                    continuation block in the file.</p></td>
        </tr>
    </table>
</div>
<br />

<p>The format of the header continuation block that this message
    points to depends on the version of the object header that the message
    is contained within.</p>

<p>
    Continuation blocks for version 1 object headers have no special
    formatting information; they are merely a list of object header message
    info sequences (type, size, flags, reserved bytes and data for each
    message sequence). See the description of <a
        href="#V1ObjectHeaderPrefix">Version 1 Data Object Header Prefix.</a>
</p>

<p>
    Continuation blocks for version 2 object headers <em>do</em> have
    special formatting information as described here (see also the
    description of <a href="#V2ObjectHeaderPrefix">Version 2 Data
        Object Header Prefix.</a>):
</p>
<div align="center">
    <table class="format">
        <caption>Version 2 Object Header Continuation Block</caption>

        <tr>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
            <th>byte</th>
        </tr>

        <tr>
            <td colspan="4">Signature</td>
        </tr>
        <tr>
            <td>Header Message Type #1</td>
            <td colspan="2">Size of Header Message Data #1</td>
            <td>Header Message #1 Flags</td>
        </tr>

        <tr>
            <td colspan="2">Header Message #1 Creation Order <em>(optional)</em></td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Header Message Data #1<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">.<br />.<br />.<br /></td>
        </tr>

        <tr>
            <td>Header Message Type #n</td>
            <td colspan="2">Size of Header Message Data #n</td>
            <td>Header Message #n Flags</td>
        </tr>

        <tr>
            <td colspan="2">Header Message #n Creation Order <em>(optional)</em></td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />Header Message Data #n<br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4">Gap <em>(optional, variable size)</em></td>
        </tr>

        <tr>
            <td colspan="4">Checksum</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Signature</p></td>
            <td>
                <p>
                    The ASCII character string &ldquo;
                    <code>OCHK</code>
                    &rdquo; is used to indicate the beginning of an object header
                    continuation block. This gives file consistency checking utilities
                    a better chance of reconstructing a damaged file.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Header Message #n Type</p></td>
            <td>
                <p>Same format as version 1 of the object header, described
                    above.</p>
            </td>
        </tr>

        <tr>
            <td><p>Size of Header Message #n Data</p></td>
            <td>
                <p>Same format as version 1 of the object header, described
                    above.</p>
            </td>
        </tr>

        <tr>
            <td><p>Header Message #n Flags</p></td>
            <td>
                <p>Same format as version 1 of the object header, described
                    above.</p>
            </td>
        </tr>

        <tr>
            <td><p>Header Message #n Creation Order</p></td>
            <td>
                <p>This field stores the order that a message of a given type
                    was created in.</p>
                <p>
                    This field is present if bit 2 of <em>flags</em> is set.
                </p>
            </td>
        </tr>

        <tr>
            <td><p>Header Message #n Data</p></td>
            <td>
                <p>Same format as version 1 of the object header, described
                    above.</p>
            </td>
        </tr>

        <tr>
            <td><p>Gap</p></td>
            <td>
                <p>A gap in an object header chunk is inferred by the end of the
                    messages for the chunk before the beginning of the chunk&rsquo;s
                    checksum. Gaps are always smaller than the size of an object header
                    message prefix (message type + message size + message flags).</p>
                <p>Gaps are formed when a message (typically an attribute
                    message) in an earlier chunk is deleted and a message from a later
                    chunk that does not quite fit into the free space is moved into the
                    earlier chunk.</p>
            </td>
        </tr>

        <tr>
            <td><p>Checksum</p></td>
            <td>
                <p>This is the checksum for the object header chunk.</p>
            </td>
        </tr>
    </table>
</div>

<br />
<h4>
    <a name="SymbolTableMessage">IV.A.2.r. The Symbol Table Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Symbol Table Message</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0011</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Fixed</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Required for &ldquo;old
                style&rdquo; groups; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>Each &ldquo;old style&rdquo; group has a v1 B-tree and a
                local heap for storing symbol table entries, which are located with
                this message.</td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>
            <b>Symbol Table Message</b>
        </caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td colspan="4"><br />v1 B-tree Address<sup>O</sup><br />
            <br /></td>
        </tr>

        <tr>
            <td colspan="4"><br />Local Heap Address<sup>O</sup><br />
            <br /></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>v1 B-tree Address</p></td>
            <td><p>This value is the address of the v1 B-tree containing
                    the symbol table entries for the group.</p></td>
        </tr>

        <tr>
            <td><p>Local Heap Address</p></td>
            <td><p>This value is the address of the local heap
                    containing the link names for the symbol table entries for the
                    group.</p></td>
        </tr>
    </table>
</div>

<br />
<h4>
    <a name="ModificationTimeMessage">IV.A.2.s. The Object Modification
        Time Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Object Modification
                Time</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0012</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Fixed</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>The object modification time is a timestamp which indicates
                the time of the last modification of an object. The time is updated
                when any object header message changes according to the system clock
                where the change was posted.</td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Modification Time Message</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td colspan="3">Reserved (zero)</td>
        </tr>

        <tr>
            <td colspan="4">Seconds After UNIX Epoch</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number is used for changes in the format
                    of Object Modification Time and is described here:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Version</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>Never used.</td>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>Used by Version 1.6.1 and after of the library to encode
                            time. In this version, the time is the seconds after Epoch.</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Seconds After UNIX Epoch</p></td>
            <td><p>A 32-bit unsigned integer value that stores the
                    number of seconds since 0 hours, 0 minutes, 0 seconds, January 1,
                    1970, Coordinated Universal Time.</p></td>
        </tr>
    </table>
</div>

<br />
<h4>
    <a name="BtreeKValuesMessage">IV.A.2.t. The B-tree &lsquo;K&rsquo;
        Values Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> B-tree
                &lsquo;K&rsquo; Values</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0013</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Fixed</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>This message retrieves non-default &lsquo;K&rsquo; values
                for internal and leaf nodes of a group or indexed storage v1
                B-trees. This message is <em>only</em> found in the superblock
                extension.
            </td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>B-tree &lsquo;K&rsquo; Values Message</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td colspan="2">Indexed Storage Internal Node K</td>
            <td bgcolor="#DDDDDD"><em>This space inserted only to align
                    table nicely</em></td>
        </tr>

        <tr>
            <td colspan="2">Group Internal Node K</td>
            <td colspan="2">Group Leaf Node K</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number for this message. This document
                    describes version 0.</p></td>
        </tr>

        <tr>
            <td><p>Indexed Storage Internal Node K</p></td>
            <td><p>This is the node &lsquo;K&rsquo; value for each
                    internal node of an indexed storage v1 B-tree. See the description
                    of this field in version 0 and 1 of the superblock as well the
                    section on v1 B-trees.</p></td>
        </tr>

        <tr>
            <td><p>Group Internal Node K</p></td>
            <td><p>This is the node &lsquo;K&rsquo; value for each
                    internal node of a group v1 B-tree. See the description of this
                    field in version 0 and 1 of the superblock as well as the section
                    on v1 B-trees.</p></td>
        </tr>

        <tr>
            <td><p>Group Leaf Node K</p></td>
            <td><p>This is the node &lsquo;K&rsquo; value for each leaf
                    node of a group v1 B-tree. See the description of this field in
                    version 0 and 1 of the superblock as well as the section on v1
                    B-trees.</p></td>
        </tr>

    </table>
</div>

<br />
<h4>
    <a name="DrvInfoMessage">IV.A.2.u. The Driver Info Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Driver Info</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0014</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>

        <tr>
            <td><b>Description:</b></td>
            <td>This message contains information needed by the file driver
                to reopen a file. This message is <em>only</em> found in the
                superblock extension: see the <a href="#SuperblockExt">
                    &ldquo;Disk Format: Level 0C - Superblock Extension&rdquo;</a> section
                for more information. For more information on the fields in the
                driver info message, see the <a href="#DriverInfo"> &ldquo;Disk
                    Format : Level 0B - File Driver Info&rdquo;</a> section; those who use
                the multi and family file drivers will find this section
                particularly helpful.
            </td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Driver Info Message</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>
        <tr>
            <td colspan="4"><br />Driver Identification</td>
        </tr>

        <tr>
            <td colspan="2">Driver Information Size</td>
            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4"><br />
            <br />Driver Information <em>(variable size)</em><br />
            <br />
            <br /></td>
        </tr>

    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number for this message. This document
                    describes version 0.</p></td>
        </tr>

        <tr>
            <td><p>Driver Identification</p></td>
            <td><p>This is an eight-byte ASCII string without null
                    termination which identifies the driver.</p></td>
        </tr>

        <tr>
            <td><p>Driver Information Size</p></td>
            <td><p>
                    The size in bytes of the <em>Driver Information</em> field of this
                    message.
                </p></td>
        </tr>

        <tr>
            <td><p>Driver Information</p></td>
            <td><p>Driver information is stored in a format defined by
                    the file driver.</p></td>
        </tr>
    </table>
</div>

<br />
<h4>
    <a name="AinfoMessage">IV.A.2.v. The Attribute Info Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Attribute Info</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0015</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Varies</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>This message stores information about the attributes on an
                object, such as the maximum creation index for the attributes
                created and the location of the attribute storage when the
                attributes are stored &ldquo;densely&rdquo;.</td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Attribute Info Message</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Flags</td>
            <td colspan="2">Maximum Creation Index <em>(optional)</em></td>
        </tr>
        <tr>
            <td colspan="4"><br />Fractal Heap Address<sup>O</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Attribute Name v2 B-tree Address<sup>O</sup><br />
            <br /></td>
        </tr>
        <tr>
            <td colspan="4"><br />Attribute Creation Order v2 B-tree
                Address<sup>O</sup> <em>(optional)</em><br />
            <br /></td>
        </tr>

    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number for this message. This document
                    describes version 0.</p></td>
        </tr>

        <tr>
            <td><p>Flags</p></td>
            <td><p>This is the attribute index information flag with the
                    following definition:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Bit</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>0</code></td>
                        <td>If set, creation order for attributes is tracked.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>If set, creation order for attributes is indexed.</td>
                    </tr>
                    <tr>
                        <td align="center"><code>2-7</code></td>
                        <td>Reserved</td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Maximum Creation Index</p></td>
            <td><p>The is the maximum creation order index value for the
                    attributes on the object.</p>
                <p>
                    This field is present if bit 0 of <em>Flags</em> is set.
                </p></td>
        </tr>

        <tr>
            <td><p>Fractal Heap Address</p></td>
            <td><p>This is the address of the fractal heap to store
                    dense attributes.</p></td>
        </tr>

        <tr>
            <td><p>Attribute Name v2 B-tree Address</p></td>
            <td><p>This is the address of the version 2 B-tree to index
                    the names of densely stored attributes.</p></td>
        </tr>

        <tr>
            <td><p>Attribute Creation Order v2 B-tree Address</p></td>
            <td><p>This is the address of the version 2 B-tree to index
                    the creation order of densely stored attributes.</p>
                <p>
                    This field is present if bit 1 of <em>Flags</em> is set.
                </p></td>
        </tr>

    </table>
</div>

<br />
<h4>
    <a name="RefCountMessage">IV.A.2.w. The Object Reference Count
        Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> Object Reference
                Count</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0016</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Fixed</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>This message stores the number of hard links (in groups or
                objects) pointing to an object: in other words, its <em>reference
                    count</em>.
            </td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>Object Reference Count</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                    only to align table nicely</em></td>
        </tr>

        <tr>
            <td colspan="4">Reference count</td>
        </tr>
    </table>
</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>The version number for this message. This document
                    describes version 0.</p></td>
        </tr>

        <tr>
            <td><p>Reference Count</p></td>
            <td><p>The unsigned 32-bit integer is the reference count
                    for the object. This message is only present in &ldquo;version
                    2&rdquo; (or later) object headers, and if not present those object
                    header versions, the reference count for the object is assumed to
                    be 1.</p></td>
        </tr>

    </table>
</div>

<br />
<h4>
    <a name="FsinfoMessage">IV.A.2.x. The File Space Info Message</a>
</h4>

<!-- start msgdesc table -->
<center>
    <table class="msgdesc">
        <tr>
            <td colspan="2"><b>Header Message Name:</b> File Space Info</td>
        </tr>
        <tr>
            <td colspan="2"><b>Header Message Type:</b> 0x0018</td>
        </tr>
        <tr>
            <td colspan="2"><b>Length:</b> Fixed</td>
        </tr>
        <tr>
            <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
        </tr>
        <tr>
            <td><b>Description:</b></td>
            <td>This message stores the file space management strategy (see
                description below) that the library uses in handling file space
                request for the file. It also contains the free-space section
                threshold used by the library&rsquo;s free-space managers for the
                file. If the strategy is 1, this message also contains the addresses
                of the file&rsquo;s free-space managers which track free space for
                each type of file space allocation. There are six basic types of
                file space allocation: superblock, B-tree, raw data, global heap,
                local heap, and object header. See the description of <a
                href="#FreeSpaceManager">Free-space Manager</a> as well the
                description of allocation types in <a href="#AppendixB">Appendix
                    B</a>.
            </td>
        </tr>
        <tr>
            <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
        </tr>
    </table>
</center>
<!-- end msgdesc table -->

<div align="center">
    <table class="format">
        <caption>File Space Info</caption>

        <tr>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
            <th width="25%">byte</th>
        </tr>

        <tr>
            <td>Version</td>
            <td>Strategy</td>
            <td colspan="2">Threshold<sup>L</sup></td>
        </tr>
        <tr>
            <td colspan="4">Super-block Free-space Manager Address<sup>O</sup></td>
        </tr>
        <tr>
            <td colspan="4">B-tree Free-space Manager Address<sup>O</sup></td>
        </tr>
        <tr>
            <td colspan="4">Raw Data Free-space Manager Address<sup>O</sup></td>
        </tr>
        <tr>
            <td colspan="4">Global Heap Free-space Manager Address<sup>O</sup></td>
        </tr>
        <tr>
            <td colspan="4">Local Heap Free-space Manager Address<sup>O</sup></td>
        </tr>
        <tr>
            <td colspan="4">Object Header Free-space Manager Address<sup>O</sup></td>
        </tr>
    </table>

    <table class="note">
        <tr>
            <td width="60%">&nbsp;</td>
            <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
                above table are of the size specified in &ldquo;Size of
                Offsets&rdquo; field in the superblock.)</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>(Items marked with an &lsquo;L&rsquo; in the above table are
                of the size specified in &ldquo;Size of Lengths&rdquo; field in the
                superblock.)</td>
        </tr>
    </table>

</div>

<br />
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
        </tr>

        <tr>
            <td><p>Version</p></td>
            <td><p>This is the version number of this message. This
                    document describes version 0.</p></td>
        </tr>

        <tr>
            <td><p>Strategy</p></td>
            <td><p>This is the file space management strategy for the
                    file. There are four types of strategies:</p>
                <table class="list">
                    <tr>
                        <th width="20%" align="center">Value</th>
                        <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                        <td align="center"><code>1</code></td>
                        <td>With this strategy, the HDF5 Library&rsquo;s free-space
                            managers track the free space that results from the manipulation
                            of HDF5 objects in the HDF5 file. The free space information is
                            saved when the file is closed, and reloaded when the file is
                            reopened. <br /> When space is needed for file metadata or raw
                            data, the HDF5 Library first requests space from the
                            library&rsquo;s free-space managers. If the request is not
                            satisfied, the library requests space from the aggregators. If
                            the request is still not satisfied, the library requests space
                            from the virtual file driver. That is, the library will use all
                            of the mechanisms for allocating space.
                        </td>
                    </tr>

                    <tr>
                        <td align="center"><code>2</code></td>
                        <td>This is the HDF5 Library&rsquo;s default file space
                            management strategy. With this strategy, the library&rsquo;s
                            free-space managers track the free space that results from the
                            manipulation of HDF5 objects in the HDF5 file. The free space
                            information is NOT saved when the file is closed and the free
                            space that exists upon file closing becomes unaccounted space in
                            the file. <br /> As with strategy #1, the library will try all
                            of the mechanisms for allocating space. When space is needed for
                            file metadata or raw data, the library first requests space from
                            the free-space managers. If the request is not satisfied, the
                            library requests space from the aggregators. If the request is
                            still not satisfied, the library requests space from the virtual
                            file driver.
                        </td>
                    </tr>

                    <tr>
                        <td align="center"><code>3</code></td>
                        <td>With this strategy, the HDF5 Library does not track free
                            space that results from the manipulation of HDF5 objects in the
                            HDF5 file and the free space becomes unaccounted space in the
                            file. <br /> When space is needed for file metadata or raw data,
                            the library first requests space from the aggregators. If the
                            request is not satisfied, the library requests space from the
                            virtual file driver.
                        </td>
                    </tr>
                    <tr>
                        <td align="center"><code>4</code></td>
                        <td>With this strategy, the HDF5 Library does not track free
                            space that results from the manipulation of HDF5 objects in the
                            HDF5 file and the free space becomes unaccounted space in the
                            file. <br /> When space is needed for file metadata or raw data,
                            the library requests space from the virtual file driver.
                        </td>
                    </tr>
                </table>
                <p></p></td>
        </tr>

        <tr>
            <td><p>Threshold</p></td>
            <td><p>
                    This is the free-space section threshold. The library&rsquo;s
                    free-space managers will track only free-space sections with size
                    greater than or equal to <em>threshold</em>. The default is to
                    track free-space sections of all sizes.
                </p></td>
        </tr>
        <tr>
            <td><p>Superblock Free-space Manager Address</p></td>
            <td><p>This is the address of the free-space manager for
                    H5FD_MEM_SUPER allocation type.</p></td>
        </tr>

        <tr>
            <td><p>B-tree Free-space Manager Address</p></td>
            <td><p>This is the address of the free-space manager for
                    H5FD_MEM_BTREE allocation type.</p></td>
        </tr>

        <tr>
            <td><p>Raw Data Free-space Manager Address</p></td>
            <td><p>This is the address of the free-space manager for
                    H5FD_MEM_DRAW allocation type.</p></td>
        </tr>

        <tr>
            <td><p>Global Heap Free-space Manager Address</p></td>
            <td><p>This is the address of the free-space manager for
                    H5FD_MEM_GHEAP allocation type.</p></td>
        </tr>

        <tr>
            <td><p>Local Heap Free-space Manager Address</p></td>
            <td><p>This is the address of the free-space manager for
                    H5FD_MEM_LHEAP allocation type.</p></td>
        </tr>

        <tr>
            <td><p>Object Header Free-space Manager Address</p></td>
            <td><p>This is the address of the free-space manager for
                    H5FD_MEM_OHDR allocation type.</p></td>
        </tr>
    </table>
</div>
<br />


<br />
<h3>
    <a name="DataStorage"> IV.B. Disk Format: Level 2B - Data Object
        Data Storage</a>
</h3>

<p>The data for an object is stored separately from its header
    information in the file and may not actually be located in the HDF5
    file itself if the header indicates that the data is stored externally.
    The information for each record in the object is stored according to
    the dimensionality of the object (indicated in the dataspace header
    message). Multi-dimensional array data is stored in C order; in other
    words, the &ldquo;last&rdquo; dimension changes fastest.</p>

<p>Data whose elements are composed of atomic datatypes are stored
    in IEEE format, unless they are specifically defined as being stored in
    a different machine format with the architecture-type information from
    the datatype header message. This means that each architecture will
    need to [potentially] byte-swap data values into the internal
    representation for that particular machine.</p>

<p>Data with a variable-length datatype is stored in the global heap
    of the HDF5 file. Global heap identifiers are stored in the data object
    storage.</p>

<p>Data whose elements are composed of reference datatypes are
    stored in several different ways depending on the particular reference
    type involved. Object pointers are just stored as the offset of the
    object header being pointed to with the size of the pointer being the
    same number of bytes as offsets in the file.</p>

<p>Dataset region references are stored as a heap-ID which points to
    the following information within the file-heap: an offset of the object
    pointed to, number-type information (same format as header message),
    dimensionality information (same format as header message), sub-set
    start and end information (in other words, a coordinate location for
    each), and field start and end names (in other words, a [pointer to
    the] string indicating the first field included and a [pointer to the]
    string name for the last field).</p>

<p>Data of a compound datatype is stored as a contiguous stream of
    the items in the structure, with each item formatted according to its
    datatype.</p>



<br />
<br />
<hr />
<h2>
    <a name="AppendixA"> V. Appendix A: Definitions</a>
</h2>

<p>Definitions of various terms used in this document are included
    in this section.</p>

<div align="center">
    <table class="glossary">
        <tr>
            <th width="20%">Term</th>
            <th>Definition</th>
        </tr>

        <tr>
            <td>Undefined Address</td>
            <td>The <a name="UndefinedAddress">undefined address</a> for a
                file is a file address with all bits set: in other words, <code>0xffff...ff</code>.
            </td>
        </tr>

        <tr>
            <td>Unlimited Size</td>
            <td>The <a name="UnlimitedDim">unlimited size</a> for a size is
                a value with all bits set: in other words, <code>0xffff...ff</code>.
            </td>
        </tr>

    </table>
</div>



<br />
<br />
<hr />
<h2>
    <a name="AppendixB"> VI. Appendix B: File Memory Allocation Types</a>
</h2>

<p>There are six basic types of file memory allocation as follows:</p>
<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Basic Allocation Type</th>
            <th>Description</th>
        </tr>

        <tr>
            <td>H5FD_MEM_SUPER</td>
            <td>File memory allocated for <em>Superblock.</em></td>
        </tr>

        <tr>
            <td>H5FD_MEM_BTREE</td>
            <td>File memory allocated for <em>B-tree.</em></td>
        </tr>

        <tr>
            <td>H5FD_MEM_DRAW</td>
            <td>File memory allocated for raw data.</td>
        </tr>

        <tr>
            <td>H5FD_MEM_GHEAP</td>
            <td>File memory allocated for <em>Global Heap.</em></td>
        </tr>

        <tr>
            <td>H5FD_MEM_LHEAP</td>
            <td>File memory allocated for <em>Local Heap.</em></td>
        </tr>

        <tr>
            <td>H5FD_MEM_OHDR</td>
            <td>File memory allocated for <em>Object Header.</em></td>
        </tr>
    </table>
</div>

<p>There are other file memory allocation types that are mapped to
    the above six basic allocation types because they are similar in
    nature. The mapping is listed in the following table:</p>

<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Basic Allocation Type</th>
            <th>Mapping of Allocation Types to Basic Allocation Types</th>
        </tr>

        <tr>
            <td>H5FD_MEM_SUPER</td>
            <td><em>none</em></td>
        </tr>

        <tr>
            <td>H5FD_MEM_BTREE</td>
            <td>H5FD_MEM_SOHM_INDEX</td>
        </tr>

        <tr>
            <td>H5FD_MEM_DRAW</td>
            <td>H5FD_MEM_FHEAP_HUGE_OBJ</td>
        </tr>

        <tr>
            <td>H5FD_MEM_GHEAP</td>
            <td><em>none</em></td>
        </tr>

        <tr>
            <td>H5FD_MEM_LHEAP</td>
            <td>H5FD_MEM_FHEAP_DBLOCK, H5FD_MEM_FSPACE_SINFO</td>
        </tr>

        <tr>
            <td>H5FD_MEM_OHDR</td>
            <td>H5FD_MEM_FHEAP_HDR, H5FD_MEM_FHEAP_IBLOCK,
                H5FD_MEM_FSPACE_HDR, H5FD_MEM_SOHM_TABLE</td>
        </tr>
    </table>
</div>

<p>Allocation types that are mapped to basic allocation types are
    described below:</p>

<div align="center">
    <table class="desc">
        <tr>
            <th width="30%">Allocation Type</th>
            <th>Description</th>
        </tr>

        <tr>
            <td>H5FD_MEM_FHEAP_HDR</td>
            <td>File memory allocated for <em>Fractal Heap Header.</em></td>
        </tr>

        <tr>
            <td>H5FD_MEM_FHEAP_DBLOCK</td>
            <td>File memory allocated for <em>Fractal Heap Direct
                    Blocks.</em></td>
        </tr>

        <tr>
            <td>H5FD_MEM_FHEAP_IBLOCK</td>
            <td>File memory allocated for <em>Fractal Heap Indirect
                    Blocks.</em></td>
        </tr>

        <tr>
            <td>H5FD_MEM_FHEAP_HUGE_OBJ</td>
            <td>File memory allocated for huge objects in the fractal heap.</td>
        </tr>

        <tr>
            <td>H5FD_MEM_FSPACE_HDR</td>
            <td>File memory allocated for <em>Free-space Manager
                    Header.</em></td>
        </tr>

        <tr>
            <td>H5FD_MEM_FSPACE_SINFO</td>
            <td>File memory allocated for <em>Free-space Section List</em>
                of the free-space manager.
            </td>
        </tr>
        <tr>
            <td>H5FD_MEM_SOHM_TABLE</td>
            <td>File memory allocated for <em>Shared Object Header
                    Message Table.</em></td>
        </tr>
        <tr>
            <td>H5FD_MEM_SOHM_INDEX</td>
            <td>File memory allocated for <em>Shared Message Record
                    List.</em></td>
        </tr>
    </table>
</div>
</div>
</body>
</html>
